다음을 통해 공유


friend 어셈블리

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의 친구이고 어셈블리 CAssemblyB를 참조하는 경우 어셈블리 C는 어셈블리internal에서 (C#) 또는 Friend (Visual Basic) 형식에 액세스할 수 없습니다.

컴파일러는 특성에 전달된 InternalsVisibleToAttribute friend 어셈블리 이름의 몇 가지 기본 유효성 검사를 수행합니다. 어셈블리 AAssemblyB를 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)을 참조하세요.

참고하십시오