friend 어셈블리
friend 어셈블리는 다른 어셈블리의 내부(C#) 또는 Friend(Visual Basic) 형식 및 멤버에 액세스할 수 있는 어셈블리입니다. AssemblyB를 friend 어셈블리로 식별하기 위해 AssemblyA에 어셈블리 특성을 추가하는 경우 AssemblyB에서 액세스하기 위해 더 이상 AssemblyA의 형식 및 멤버를 공용으로 표시할 필요가 없습니다. 다음과 같은 시나리오에서 특히 편리합니다.
유닛 테스트 중 테스트 코드는 별도의 어셈블리에서 실행되지만 테스트 중인 어셈블리에서
internal
(C#) 또는Friend
(Visual Basic)로 표시된 멤버에 액세스해야 하는 경우.클래스 라이브러리를 개발하고 있고 라이브러리에 대한 추가 사항이 별도의 어셈블리에 포함되어 있지만, 기존 어셈블리에서
internal
(C#) 또는Friend
(Visual Basic)으로 표시된 멤버에 액세스해야 하는 경우.
설명
InternalsVisibleToAttribute 특성을 사용하여 지정된 어셈블리에 대해 하나 이상의 friend 어셈블리를 식별할 수 있습니다. 다음 예제에서는 AssemblyA의 InternalsVisibleToAttribute 특성을 사용하고 어셈블리 어셈블리B를 friend 어셈블리로 지정합니다. 그러면 어셈블리 B 어셈블리가 어셈블리 A에서 internal
(C#) 또는 Friend
(Visual Basic)로 표시된 모든 형식 및 멤버에 액세스할 수 있습니다.
참고 항목
내부 형식 또는 AssemblyA와 같은 다른 어셈블리의 내부 멤버에 액세스하는 AssemblyB와 같은 어셈블리를 컴파일하는 경우 -out 컴파일러 옵션을 사용하여 출력 파일의 이름(.exe 또는 .dll)을 명시적으로 지정해야 합니다. 컴파일러가 외부 참조에 바인딩할 때 작성하고 있는 어셈블리에 대해 이름을 생성하지 않았기 때문에 이 과정이 필요합니다. 자세한 내용은 OutputAssembly (C#) 또는 -out(Visual Basic)을 참조하세요.
using System.Runtime.CompilerServices;
using System;
[assembly: InternalsVisibleTo("AssemblyB")]
// The class is internal by default.
class FriendClass
{
public void Test()
{
Console.WriteLine("Sample Class");
}
}
// Public class that has an internal method.
public class ClassWithFriendMethod
{
internal void Test()
{
Console.WriteLine("Sample Method");
}
}
Imports System.Runtime.CompilerServices
<Assembly: InternalsVisibleTo("AssemblyB")>
' Friend class.
Friend Class FriendClass
Public Sub Test()
Console.WriteLine("Sample Class")
End Sub
End Class
' Public class with a Friend method.
Public Class ClassWithFriendMethod
Friend Sub Test()
Console.WriteLine("Sample Method")
End Sub
End Class
friend로 명시적으로 지정하는 어셈블리만 internal
(C#) 또는 Friend
(Visual Basic) 형식 및 멤버에 액세스할 수 있습니다. 예를 들어 어셈블리 B가 어셈블리 A의 friend이고 어셈블리 C가 어셈블리 B를 참조하는 경우, 어셈블리 C는 어셈블리 A의 internal
(C#)또는 Friend
(Visual Basic) 형식에 액세스할 수 없습니다.
컴파일러는 InternalsVisibleToAttribute 특성에 전달된 friend 어셈블리 이름에 대해 몇 가지 기본적인 유효성 검사를 수행합니다. 어셈블리 A가 어셈블리 B를 friend 어셈블리로 선언하는 경우, 유효성 검사 규칙은 다음과 같습니다.
어셈블리 A에 강력한 이름을 지정한 경우 어셈블리 B에도 강력한 이름을 지정해야 합니다. 특성에 전달되는 friend 어셈블리 이름은 어셈블리 이름과 어셈블리 B에 서명하는 데 사용되는 강력한 이름 키의 공개 키로 구성되어야 합니다.
InternalsVisibleToAttribute 특성에 전달되는 friend 어셈블리 이름은 어셈블리 B의 강력한 이름일 수 없습니다. 어셈블리 버전, 문화권, 아키텍처 또는 공개 키 토큰을 포함하지 마세요.
어셈블리 A에 강력한 이름을 지정하지 않은 경우 friend 어셈블리 이름은 어셈블리 이름만으로 구성되어야 합니다. 자세한 내용은 방법: 서명되지 않은 friend 어셈블리 만들기를 참조하세요.
어셈블리 B에 강력한 이름을 지정하는 경우 프로젝트 설정이나 명령줄
/keyfile
컴파일러 옵션을 사용하여 어셈블리 B에 강력한 이름 키를 지정해야 합니다. 자세한 내용은 방법: 서명된 friend 어셈블리 만들기를 참조하세요.
StrongNameIdentityPermission 클래스도 형식을 공유하는 기능을 제공하지만 다음과 같은 차이점이 있습니다.
StrongNameIdentityPermission은 개별 형식에 적용되는 반면 friend 어셈블리는 전체 어셈블리에 적용됩니다.
어셈블리 A에 어셈블리 B와 공유하려는 수백 개의 형식이 있는 경우 모든 형식에 StrongNameIdentityPermission을 추가해야 합니다. friend 어셈블리를 사용하는 경우에는 friend 관계를 한 번만 선언하면 됩니다.
StrongNameIdentityPermission을 사용하는 경우 공유하려는 형식을 public으로 선언해야 합니다. friend 어셈블리를 사용하는 경우 공유 유형은
internal
(C#) 또는Friend
(Visual Basic)로 선언됩니다.
모듈 파일(.netmodule 확장자를 사용하는 파일)에서 어셈블리 internal
(C#) 또는 Friend
(Visual Basic) 형식 및 메서드에 액세스하는 방법에 대한 자세한 내용은 ModuleAssemblyName(C#) 또는 -moduleassemblyname(Visual Basic)을 참조하세요.
참고 항목
.NET