friend 어셈블리는 다른 어셈블리의 내부(C#) 또는 Friend(Visual Basic) 형식 및 멤버에 액세스할 수 있는 어셈블리입니다. AssemblyB를 friend 어셈블리로 식별하기 위해 AssemblyA에 어셈블리 특성을 추가하는 경우 AssemblyB에서 액세스하기 위해 더 이상 AssemblyA의 형식 및 멤버를 공용으로 표시할 필요가 없습니다. 이는 다음 시나리오에서 특히 편리합니다.
단위 테스트 중에 테스트 코드가 별도의 어셈블리에서 실행될 때, C#에서
internal
로 표시되거나 Visual Basic에서Friend
로 표시된 테스트 중인 어셈블리의 멤버에 대한 액세스가 필요한 경우클래스 라이브러리를 개발하는 경우 라이브러리에 대한 추가는 별도의 어셈블리에 포함되지만 C# 또는
internal
Visual Basic으로 표시된Friend
기존 어셈블리의 멤버에 대한 액세스가 필요합니다.
비고
InternalsVisibleToAttribute 특성을 사용하여 특정 어셈블리에 대해 하나 이상의 friend 어셈블리를 식별할 수 있습니다. 다음 예제에서는 InternalsVisibleToAttribute의 특성을 사용하고 AssemblyB 어셈블리를 프렌드 어셈블리로 지정합니다. 이렇게 하면 어셈블리B에 C#에서 또는 Visual Basic에서 internal
으로 표시된 Friend
의 모든 타입 및 멤버에 대한 액세스 권한을 부여합니다.
비고
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
명시적으로 친구로 지정한 어셈블리만 internal
(C#) 또는 Friend
(Visual Basic) 형식 및 멤버에 액세스할 수 있습니다. 예를 들어 AssemblyB가 어셈블리 A의 친구이고 어셈블리 C가 AssemblyB를 참조하는 경우 어셈블리 C는 어셈블리internal
에서 (C#) 또는 Friend
(Visual Basic) 형식에 액세스할 수 없습니다.
컴파일러는 특성에 전달된 InternalsVisibleToAttribute friend 어셈블리 이름의 몇 가지 기본 유효성 검사를 수행합니다. 어셈블리 A가 AssemblyB를 friend 어셈블리로 선언하는 경우 유효성 검사 규칙은 다음과 같습니다.
어셈블리 A가 강력한 이름이면 AssemblyB도 강력한 이름을 지정해야 합니다. 특성에 전달되는 friend 어셈블리 이름은 어셈블리 이름과 AssemblyB에 서명하는 데 사용되는 강력한 이름 키의 공개 키로 구성되어야 합니다.
특성 InternalsVisibleToAttribute에 전달되는 친구 어셈블리 이름은 AssemblyB의 강력한 이름이 될 수 없습니다. 어셈블리 버전, 문화권, 아키텍처 또는 공개 키 토큰을 포함하지 마세요.
어셈블리 A가 강력한 이름이 아닌 경우, friend 어셈블리 이름은 어셈블리 이름 하나로만 구성되어야 합니다. 자세한 내용은 방법: 서명되지 않은 friend 어셈블리 만들기를 참조하세요.
AssemblyB 이름이 강력한 경우 프로젝트 설정 또는 명령줄 컴파일러 옵션을 사용하여
/keyfile
에 대한 강력한 이름 키를 지정해야 합니다. 자세한 내용은 방법: 서명된 friend 어셈블리 만들기를 참조하세요.
클래스는 StrongNameIdentityPermission 다음과 같은 차이점과 함께 형식을 공유하는 기능도 제공합니다.
StrongNameIdentityPermission 는 개별 형식에 적용되며 friend 어셈블리는 전체 어셈블리에 적용됩니다.
AssemblyB와 공유하려는 어셈블리 A에 수백 개의 형식이 있는 경우 모든 형식에 추가 StrongNameIdentityPermission 해야 합니다. friend 어셈블리를 사용하는 경우 친구 관계를 한 번만 선언하면 됩니다.
사용하는 StrongNameIdentityPermission경우 공유하려는 형식을 public으로 선언해야 합니다. friend 어셈블리를 사용하는 경우 공유 형식이 (C#) 또는
internal
(Visual Basic)으로Friend
선언됩니다.
모듈 파일(internal
확장자를 사용하는 파일)에서 어셈블리 Friend
(C#) 또는 (Visual Basic) 형식 및 메서드에 액세스하는 방법에 대한 자세한 내용은 ModuleAssemblyName(C#) 또는 -moduleassemblyname(Visual Basic)을 참조하세요.
참고하십시오
.NET