Friend 어셈블리(C# 프로그래밍 가이드)
업데이트: 2007년 11월
한 어셈블리에서 다른 어셈블리의 내부 형식이나 내부 멤버에 액세스할 수 있습니다.
설명
friend 어셈블리 기능을 사용하면 내부 멤버에 액세스할 수 있습니다. 이 경우에도 전용 형식이나 전용 멤버에는 액세스할 수 없습니다.
한 어셈블리(어셈블리 B)가 다른 어셈블리(어셈블리 A)의 내부 형식과 멤버에 액세스하도록 하려면 어셈블리 A에 InternalsVisibleToAttribute 특성을 사용합니다.
참고: |
---|
다른 어셈블리(어셈블리 A)의 내부 형식이나 내부 멤버에 액세스하는 어셈블리(어셈블리 B)를 컴파일할 때는 /out 컴파일러 옵션을 사용하여 출력 파일(.exe 또는 .dll)의 이름을 명시적으로 지정해야 합니다. 자세한 내용은 /out을 참조하십시오. 컴파일러가 빌드하려는 어셈블리를 외부 참조에 바인딩할 때는 아직 이 어셈블리의 이름이 생성되지 않은 상태이기 때문입니다. |
StrongNameIdentityPermission 클래스를 통해서도 형식을 공유할 수 있지만 다음과 같은 차이점이 있습니다.
friend 어셈블리는 전체 어셈블리에 적용되는 반면 StrongNameIdentityPermission은 개별 형식에 적용됩니다.
A 어셈블리에 B 어셈블리와 공유하려는 형식이 매우 많은 경우에는 일일이 StrongNameIdentityPermission을 사용하여 지정해야 하지만, friend 어셈블리를 사용하면 friend 관계를 한 번만 선언하면 됩니다.
StrongNameIdentityPermission을 사용하는 경우에는 공유하려는 형식은 public으로 선언되어야 합니다. friend 어셈블리의 경우에는 공유되는 형식은 internal로 선언됩니다.
어셈블리에 있는 public이 아닌 형식에 액세스할 수 있는 .netmodule을 빌드하는 방법에 대한 자세한 내용은 /moduleassemblyname을 참조하십시오.
예제
이 예제에서는 어셈블리의 내부 형식과 내부 멤버가 cs_friend_assemblies_2라는 어셈블리에 표시되도록 합니다.
// cs_friend_assemblies.cs
// compile with: /target:library
using System.Runtime.CompilerServices;
using System;
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
// internal by default
class Class1
{
public void Test()
{
Console.WriteLine("Class1.Test");
}
}
// public type with internal member
public class Class2
{
internal void Test()
{
Console.WriteLine("Class2.Test");
}
}
이 예제에서는 어셈블리가 cs_friend_assemblies.dll 어셈블리의 내부 형식과 내부 멤버를 사용합니다.
이 경우 출력 파일의 이름(/out:cs_friend_assemblies_2.exe)을 지정해야 합니다.
이 어셈블리의 내부 형식과 멤버에 다른 어셈블리(어셈블리 C)가 액세스할 수 있도록 하는 경우 어셈블리 C는 자동으로 cs_friend_assemblies.dll의 friend 어셈블리가 되지 않습니다.
// cs_friend_assemblies_2.cs
// compile with: /reference:cs_friend_assemblies.dll /out:cs_friend_assemblies_2.exe
public class M
{
static void Main()
{
// access an internal type
Class1 a = new Class1();
a.Test();
Class2 b = new Class2();
// access an internal member of a public type
b.Test();
}
}
Class1.Test
Class2.Test
이 예제에서는 강력한 이름이 사용되는 어셈블리에 사용할 수 있는 내부 형식과 멤버를 만드는 방법을 보여 줍니다.
키 파일을 생성하고 공개 키를 표시하려면 sn.exe 명령의 다음과 같은 시퀀스를 사용합니다. 자세한 내용은 강력한 이름 도구(Sn.exe)를 참조하십시오.
sn -k friend_assemblies.snk // Generate strong name key
sn -p friend_assemblies.snk key.publickey // Extract public key from key.snk into key.publickey
sn -tp key.publickey // Display public key stored in file'key.publickey
/keyfile을 사용하여 컴파일러에 키 파일을 전달합니다.
// cs_friend_assemblies_3.cs
// compile with: /target:library /keyfile:friend_assemblies.snk
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("cs_friend_assemblies_4, PublicKey=0024000004800000940000000602000000240000525341310004000001000100031d7b6f3abc16c7de526fd67ec2926fe68ed2f9901afbc5f1b6b428bf6cd9086021a0b38b76bc340dc6ab27b65e4a593fa0e60689ac98dd71a12248ca025751d135df7b98c5f9d09172f7b62dabdd302b2a1ae688731ff3fc7a6ab9e8cf39fb73c60667e1b071ef7da5838dc009ae0119a9cbff2c581fc0f2d966b77114b2c4")]
class Class1
{
public void Test()
{
System.Console.WriteLine("Class1.Test");
}
}
이 예제에서는 강력한 이름이 사용되는 어셈블리에 사용할 수 있는 내부 형식과 멤버를 사용하는 방법을 보여 줍니다.
// cs_friend_assemblies_4.cs
// compile with: /keyfile:friend_assemblies.snk /reference:cs_friend_assemblies_3.dll /out:cs_friend_assemblies_4.exe
public class M
{
static void Main()
{
Class1 a = new Class1();
a.Test();
}
}
Class1.Test