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)
참조
개념
어셈블리와 전역 어셈블리 캐시(C# 및 Visual Basic)