Share via


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

참고 항목

개념

C# 프로그래밍 가이드

참조

어셈블리 및 전역 어셈블리 캐시(C# 프로그래밍 가이드)