다음을 통해 공유


Friend 어셈블리(C# 및 Visual Basic)

Friend 어셈블리는 다른 어셈블리의 Friend(Visual Basic) 또는 internal(C#) 형식과 멤버에 액세스할 수 있는 어셈블리입니다. 어셈블리를 friend 어셈블리로 식별하면 다른 어셈블리에서 형식 및 멤버에 액세스할 수 있도록 하기 위해 해당 형식 및 멤버를 더 이상 public으로 표시하지 않아도 됩니다. 이는 다음과 같은 경우에 특히 편리합니다.

  • 단위 테스트 동안 테스트 코드가 별도의 어셈블리에서 실행되지만 테스트 중인 어셈블리에서 Friend(Visual Basic)나 internal(C#)로 표시된 멤버에 액세스해야 하는 경우

  • 클래스 라이브러리를 개발할 때 라이브러리에 대한 추가 항목이 별도의 어셈블리에 포함되어 있지만 기존 어셈블리에서 Friend(Visual Basic)나 internal(C#)로 표시된 멤버에 액세스해야 하는 경우

설명

InternalsVisibleToAttribute 특성을 사용하여 지정된 어셈블리에 대한 하나 이상의 friend 어셈블리를 식별할 수 있습니다. 다음 예제에서는 어셈블리 A에 InternalsVisibleToAttribute 특성을 사용하고 AssemblyB 어셈블리를 friend 어셈블리로 지정합니다. 이로써 AssemblyB 어셈블리가 Friend(Visual Basic)나 internal(C#)로 표시된 어셈블리 A의 모든 형식과 멤버에 액세스할 수 있습니다.

참고

다른 어셈블리(어셈블리 A)의 내부 형식이나 내부 멤버에 액세스하는 어셈블리(AssemblyB 어셈블리)를 컴파일할 때는 /out 컴파일러 옵션을 사용하여 출력 파일(.exe 또는 .dll)의 이름을 명시적으로 지정해야 합니다.컴파일러가 빌드하려는 어셈블리를 외부 참조에 바인딩할 때는 아직 이 어셈블리의 이름이 생성되지 않은 상태이기 때문입니다.자세한 내용은 /out (C#)/out(Visual Basic)을 참조하십시오.

Imports System.Runtime.CompilerServices
Imports System
<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
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");
    }

}

명시적으로 friend로 지정하는 어셈블리만 Friend(Visual Basic)나 internal(C#) 형식 및 멤버에 액세스할 수 있습니다. 예를 들어 어셈블리 B가 어셈블리 A의 friend이고 어셈블리 C가 어셈블리 B를 참조하는 경우 C는 A의 Friend(Visual Basic) 또는 internal(C#) 형식에 액세스할 수 없습니다.

컴파일러에서는 InternalsVisibleToAttribute 특성에 전달된 friend 어셈블리 이름에 대한 일부 기본적인 유효성 검사를 수행합니다. 어셈블리 A에서 B를 friend 어셈블리로 선언하는 경우 유효성 검사 규칙은 다음과 같습니다.

  • 어셈블리 A에 강력한 이름이 지정된 경우 어셈블리 B에도 강력한 이름이 지정되어야 합니다. 특성에 전달되는 friend 어셈블리 이름은 어셈블리 이름과 어셈블리 B에 서명하는 데 사용되는 강력한 이름 키의 공개 키로 구성되어야 합니다.

    InternalsVisibleToAttribute 특성에 전달되는 friend 어셈블리 이름은 어셈블리 B의 강력한 이름일 수 없습니다. 즉, 어셈블리 버전, 문화권, 아키텍처 또는 공개 키 토큰을 포함하지 않습니다.

  • 어셈블리 A에 강력한 이름이 지정되지 않은 경우 friend 어셈블리 이름은 어셈블리 이름만으로 구성되어야 합니다. 자세한 내용은 방법: 서명되지 않은 Friend 어셈블리 만들기(C# 및 Visual Basic)를 참조하십시오.

  • 어셈블리 B에 강력한 이름이 지정된 경우 프로젝트 설정이나 명령줄 /keyfile 컴파일러 옵션을 사용하여 어셈블리 B의 강력한 이름 키를 지정해야 합니다. 자세한 내용은 방법: 서명된 Friend 어셈블리 만들기(C# 및 Visual Basic)를 참조하십시오.

StrongNameIdentityPermission 클래스를 통해서도 형식을 공유할 수 있지만 다음과 같은 차이점이 있습니다.

  • friend 어셈블리는 전체 어셈블리에 적용되는 반면 StrongNameIdentityPermission은 개별 형식에 적용됩니다.

  • A에 어셈블리 B와 공유하려는 수백 개의 형식이 있는 경우 이러한 모든 형식에 StrongNameIdentityPermission을 추가해야 합니다. friend 어셈블리를 사용할 경우 friend 관계를 한 번만 선언하면 됩니다.

  • StrongNameIdentityPermission을 사용하는 경우에는 공유하려는 형식을 public으로 선언해야 합니다. friend 어셈블리를 사용하는 경우에는 공유되는 형식이 Friend(Visual Basic)나 internal(C#)로 선언됩니다.

모듈 파일(확장명이 .netmodule인 파일)에서 어셈블리의 Friend(Visual Basic) 또는 internal(C#) 형식과 메서드에 액세스하는 방법에 대한 자세한 내용은 /moduleassemblyname(Visual Basic)/moduleassemblyname(C#)을 참조하십시오.

참고 항목

작업

방법: 서명되지 않은 Friend 어셈블리 만들기(C# 및 Visual Basic)

방법: 서명된 Friend 어셈블리 만들기(C# 및 Visual Basic)

참조

InternalsVisibleToAttribute

StrongNameIdentityPermission

개념

어셈블리와 전역 어셈블리 캐시(C# 및 Visual Basic)

C# 프로그래밍 가이드

기타 리소스

Visual Basic 프로그래밍 가이드