다음을 통해 공유


InternalsVisibleToAttribute(String) 생성자

정의

지정된 friend 어셈블리의 이름을 사용하여 InternalsVisibleToAttribute 클래스의 새 인스턴스를 초기화합니다.

public:
 InternalsVisibleToAttribute(System::String ^ assemblyName);
public InternalsVisibleToAttribute (string assemblyName);
new System.Runtime.CompilerServices.InternalsVisibleToAttribute : string -> System.Runtime.CompilerServices.InternalsVisibleToAttribute
Public Sub New (assemblyName As String)

매개 변수

assemblyName
String

friend 어셈블리의 이름입니다.

예제

서명된 어셈블리

다음 예제에서는 InternalsVisibleToAttribute 특성을 사용하여 서명된 어셈블리의 AppendDirectorySeparator 명명된 internal 메서드를 다른 서명된 어셈블리에 표시합니다. 내부 AppendDirectorySeparator 메서드를 포함하는 FileUtilities 클래스를 정의합니다. InternalsVisibleToAttribute 특성은 FileUtilities 클래스를 포함하는 어셈블리에 적용됩니다. 이 특성을 사용하면 Friend1이라는 어셈블리가 이 내부 멤버에 액세스할 수 있습니다.

//
// The source code should be saved in a file named Example1.cs. It 
// can be compiled at the command line as follows:
//
//    csc /t:library /keyfile:<snkfilename> Assembly1.cs
//
// The public key of the Friend1 file should be changed to the full
// public key stored in your strong-named key file.
//
using System;
using System.IO;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("Friend1, PublicKey=002400000480000094" + 
                              "0000000602000000240000525341310004000" +
                              "001000100bf8c25fcd44838d87e245ab35bf7" +
                              "3ba2615707feea295709559b3de903fb95a93" +
                              "3d2729967c3184a97d7b84c7547cd87e435b5" +
                              "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" +
                              "712da72eec2533dc00f8529c3a0bbb4103282" +
                              "f0d894d5f34e9f0103c473dce9f4b457a5dee" +
                              "fd8f920d8681ed6dfcb0a81e96bd9b176525a" +
                              "26e0b3")]

public class FileUtilities
{
   internal static string AppendDirectorySeparator(string dir)
   {
      if (!dir.Trim().EndsWith(Path.DirectorySeparatorChar.ToString()))
         return dir.Trim() + Path.DirectorySeparatorChar;
      else
         return dir;
   }
}
'
' The source code should be saved in a file named Example1.cs. It 
' can be compiled at the command line as follows:
'
'    vbc Assembly1.vb /t:library /keyfile:<snkfilename> 
'
' The public key of the Friend1 file should be changed to the full
' public key stored in your strong-named key file.
'
Imports System.IO
Imports System.Runtime.CompilerServices

<Assembly:InternalsVisibleTo("Friend1, PublicKey=002400000480000094" + _
                             "0000000602000000240000525341310004000" + _
                             "001000100bf8c25fcd44838d87e245ab35bf7" + _
                             "3ba2615707feea295709559b3de903fb95a93" + _
                             "3d2729967c3184a97d7b84c7547cd87e435b5" + _
                             "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" + _
                             "712da72eec2533dc00f8529c3a0bbb4103282" + _
                             "f0d894d5f34e9f0103c473dce9f4b457a5dee" + _
                             "fd8f920d8681ed6dfcb0a81e96bd9b176525a" + _
                             "26e0b3")>

Public Class FileUtilities
   Friend Shared Function AppendDirectorySeparator(dir As String) As String
      If Not dir.Trim().EndsWith(Path.DirectorySeparatorChar) Then
         Return dir.Trim() + Path.DirectorySeparatorChar
      Else
         Return dir
      End If   
   End Function
End Class

다음 예제가 Friend1명명된 강력한 이름의 어셈블리로 컴파일되는 경우 메서드가 Assembly1 어셈블리 내부임에도 불구하고 FileUtilities.AppendDirectorySeparator 메서드를 성공적으로 호출할 수 있습니다. 명령줄에서 C#으로 컴파일하는 경우 /out 컴파일러 스위치를 사용하여 컴파일러가 외부 참조에 바인딩할 때 friend 어셈블리의 이름을 사용할 수 있는지 확인해야 합니다.

//
// The assembly that exposes its internal types to this assembly should be
// named Assembly1.dll.
//
// The public key of this assembly should correspond to the public key
// specified in the class constructor of the InternalsVisibleTo attribute in the
// Assembly1 assembly.
//
#using <Assembly1.dll> as_friend

using namespace System;

void main()
{
   String^ dir = L"C:\\Program Files";
   dir = FileUtilities::AppendDirectorySeparator(dir);
   Console::WriteLine(dir);
}
// The example displays the following output:
//       C:\Program Files\
//
// The source code should be saved in a file named Friend1.cs. It 
// can be compiled at the command line as follows:
//
//    csc /r:Assembly1.dll /keyfile:<snkfilename> /out:Friend1.dll Friend1.cs
//
// The public key of the Friend1 assembly should correspond to the public key
// specified in the class constructor of the InternalsVisibleTo attribute in the
// Assembly1 assembly.
//
using System;

public class Example
{
   public static void Main()
   {
      string dir = @"C:\Program Files";
      dir = FileUtilities.AppendDirectorySeparator(dir);
      Console.WriteLine(dir);
   }
}
// The example displays the following output:
//       C:\Program Files\
'
' The source code should be saved in a file named Friend1.vb. It 
' can be compiled at the command line as follows:
'
'    vbc Friend1.vb /r:Assembly1.dll /keyfile:<snkfilename> 
'
' The public key of the Friend1 assembly should correspond to the public key
' specified in the class constructor of the InternalsVisibleTo attribute in the
' Assembly1 assembly.
'
Module Example
   Public Sub Main()
      Dim dir As String = "C:\Program Files"
      dir = FileUtilities.AppendDirectorySeparator(dir)
      Console.WriteLine(dir)
   End Sub
End Module
' The example displays the following output:
'       C:\Program Files\

다음 예제에서는 InternalsVisibleToAttribute 특성을 사용하여 서명되지 않은 어셈블리의 internal 멤버를 다른 서명되지 않은 어셈블리에 표시합니다. 이 특성은 UtilityLib 어셈블리의 internalStringLib.IsFirstLetterUpperCase 메서드가 Friend2어셈블리의 코드에 표시되는지 확인합니다. 다음은 UtilityLib.dll소스 코드입니다.

using System;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleToAttribute("Friend2")]

namespace Utilities.StringUtilities
{
   public class StringLib
   {
      internal static bool IsFirstLetterUpperCase(String s)
      {
         string first = s.Substring(0, 1);
         return first == first.ToUpper();
      }
   }
}

Imports System.Runtime.CompilerServices

<assembly: InternalsVisibleTo("Friend2")>

Namespace Utilities.StringUtilities
   Public Class StringLib
      Friend Shared Function IsFirstLetterUpperCase(s As String) As Boolean
         Dim first As String = s.Substring(0, 1)
         Return first = first.ToUpper()
      End Function
   End Class
End Namespace

서명되지 않은 어셈블리

다음 예제에서는 Friend2 어셈블리의 소스 코드를 제공합니다. 명령줄에서 C#으로 컴파일하는 경우 /out 컴파일러 스위치를 사용하여 컴파일러가 외부 참조에 바인딩할 때 friend 어셈블리의 이름을 사용할 수 있는지 확인해야 합니다.

#using <UtilityLib.dll> as_friend

using namespace System;
using namespace Utilities::StringUtilities;

void main()
{
   String^ s = "The Sign of the Four";
   Console::WriteLine(StringLib::IsFirstLetterUpperCase(s));
}
using System;
using Utilities.StringUtilities;

public class Example
{
   public static void Main()
   {
      String s = "The Sign of the Four";
      Console.WriteLine(StringLib.IsFirstLetterUpperCase(s));
   }
}
Imports Utilities.StringUtilities

Module Example
   Public Sub Main()
      Dim s As String = "The Sign of the Four"
      Console.WriteLine(StringLib.IsFirstLetterUpperCase(s))
   End Sub
End Module

설명

InternalsVisibleToAttribute 생성자는 현재 어셈블리의 내부 및 프라이빗 보호 형식 및 멤버에 액세스할 수 있는 어셈블리인 friend 어셈블리를 정의합니다.

현재 어셈블리와 friend 어셈블리는 모두 서명되지 않아야 합니다. 또는 둘 다 강력한 이름으로 서명해야 합니다. (강력한 이름의 어셈블리에 대한 자세한 내용은 만들기 및 강력한 이름의 어셈블리사용)을 참조하세요. 둘 다 서명되지 않은 경우 assemblyName 인수는 디렉터리 경로 또는 파일 확장명 없이 지정된 friend 어셈블리의 이름으로 구성됩니다. 둘 다 서명된 경우 assemblyName 디렉터리 경로 또는 파일 이름 확장명 없이 friend 어셈블리의 이름과 전체 공개 키(공개 키 토큰은 아님)로 구성됩니다. 문화권, 버전 또는 프로세서 아키텍처 정보를 제공하는 것과 같은 강력한 이름의 다른 구성 요소는 assemblyName 인수에 지정할 수 없습니다.

중요하다

C# 컴파일러를 사용하여 friend 어셈블리를 컴파일하는 경우 /out 컴파일러 옵션을 사용하여 출력 파일(.exe 또는 .dll)의 이름을 명시적으로 지정해야 합니다. 컴파일러가 외부 참조에 바인딩할 때 빌드 중인 어셈블리의 이름을 아직 생성하지 않았기 때문에 이 작업이 필요합니다. visual Basic 컴파일러에 대한 /out 컴파일러 옵션은 선택 사항이며 F# 컴파일러를 사용하여 friend 어셈블리를 컴파일할 때는 해당 -out 또는 -o 컴파일러 옵션을 사용하면 안 됩니다.

Sn.exe(강력한 이름 도구) 사용하여 강력한 이름의 키(.snk) 파일에서 전체 공개 키를 검색할 수 있습니다. 이렇게 하려면 다음 단계를 수행합니다.

  1. 강력한 이름의 키 파일에서 공개 키를 별도의 파일로 추출합니다.

    Sn -psnk_file아웃파일

  2. 콘솔에 전체 공개 키를 표시합니다.

    Sn -tp아웃파일

  3. 전체 공개 키 값을 복사하여 소스 코드에 붙여넣습니다.

InternalsVisibleToAttribute 특성을 사용하는 방법에 대한 자세한 내용은 다음 문서를 참조하세요.

적용 대상