InternalsVisibleToAttribute 클래스

정의

일반적으로는 현재 어셈블리 내에서만 볼 수 있는 형식을 지정된 어셈블리에서 볼 수 있도록 지정합니다.

public ref class InternalsVisibleToAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
public sealed class InternalsVisibleToAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)>]
type InternalsVisibleToAttribute = class
    inherit Attribute
Public NotInheritable Class InternalsVisibleToAttribute
Inherits Attribute
상속
InternalsVisibleToAttribute
특성

예제

서명된 어셈블리

다음 예제에서는 특성을 사용하여 InternalsVisibleToAttribute 서명된 internal 어셈블리에 이름이 지정된 AppendDirectorySeparator 메서드를 다른 서명된 어셈블리에 표시합니다. 내부 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어셈블리로 컴파일되는 경우 메서드가 Example.Main 어셈블리 내부이지만 메서드를 Friend1 성공적으로 호출 FileUtilities.AppendDirectorySeparatorAssembly1 수 있습니다. 명령줄에서 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\

서명되지 않은 어셈블리

다음 예제에서는 특성을 internal 사용하여 InternalsVisibleToAttribute 서명되지 않은 어셈블리의 멤버를 다른 서명되지 않은 어셈블리에 표시합니다. 이 특성은 명명된 어셈블리의 internal StringLib.IsFirstLetterUpperCase 메서드가 명명 UtilityLib 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

설명

일반적으로 C#의 범위 또는 Friend Visual Basic 범위가 있는 형식 및 멤버 internal 는 정의된 어셈블리에서만 표시됩니다. 범위(Protected FriendVisual Basic 범위)가 있는 형식 및 멤버 protected internal 는 자체 어셈블리 또는 포함하는 클래스에서 파생된 형식에만 표시됩니다. 범위(Private ProtectedVisual Basic 범위)가 있는 형식 및 멤버 private protected 는 포함하는 클래스 또는 현재 어셈블리 내의 포함하는 클래스에서 파생되는 형식으로 표시됩니다.

이 특성은 InternalsVisibleToAttribute 이러한 형식과 멤버를 friend 어셈블리라고 하는 지정된 어셈블리의 형식에도 표시하도록 합니다. 이는 (FriendVisual Basic), (Protected FriendVisual Basic) protected internalprivate protected (Private ProtectedVisual Basic) 멤버에만 internal 적용되지만 해당 멤버에는 적용되지 않습니다private.

참고

(Private ProtectedVisual Basic) 멤버 InternalsVisibleToAttribute 의 경우 특성은 멤버의 private protected 포함하는 클래스 에서 파생되는 형식으로만 접근성을 확장합니다.

특성은 어셈블리 수준에서 적용됩니다. 즉, 소스 코드 파일의 시작 부분에 포함되거나 Visual Studio 프로젝트의 AssemblyInfo 파일에 포함될 수 있습니다. 특성을 사용하여 현재 어셈블리의 내부 형식 및 멤버에 액세스할 수 있는 단일 friend 어셈블리를 지정할 수 있습니다. 두 가지 방법으로 여러 friend 어셈블리를 정의할 수 있습니다. 다음 예제와 같이 개별 어셈블리 수준 특성으로 표시할 수 있습니다.

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>

다음 예제와 같이 별도의 InternalsVisibleToAttribute 태그와 함께 assembly 단일 키워드로 표시할 수도 있습니다.

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
 Assembly:InternalsVisibleTo("Friend2b")>

friend 어셈블리는 생성자로 식별됩니다 InternalsVisibleToAttribute . 현재 어셈블리와 friend 어셈블리는 모두 서명되지 않아야 합니다. 그렇지 않으면 두 어셈블리가 모두 강력한 이름으로 서명되어야 합니다.

두 어셈블리가 모두 서명 assemblyName 되지 않은 경우 인수는 디렉터리 경로 또는 파일 이름 확장명 없이 지정된 friend 어셈블리의 이름으로 구성됩니다.

두 어셈블리가 모두 강력한 이름으로 서명된 경우 생성자에 대한 InternalsVisibleToAttribute 인수는 전체 공개 키(공개 키 토큰이 아님)와 함께 디렉터리 경로 또는 파일 이름 확장명 없이 어셈블리의 이름으로 구성되어야 합니다. 강력한 이름의 어셈블리의 전체 공개 키를 가져오려면 이 문서의 뒷부 분에 있는 전체 공개 키 가져오기 섹션을 참조하세요. 강력한 이름의 어셈블리를 사용하는 InternalsVisibleToAttribute 방법에 대한 자세한 내용은 생성자를 참조 InternalsVisibleToAttribute 하세요.

인수에 , Version또는 ProcessorArchitecture 필드에 대한 CultureInfo값을 포함하지 마세요. Visual Basic, C#, C++ 컴파일러는 이를 컴파일러 오류로 처리합니다. 오류로 처리하지 않는 컴파일러(예: IL 어셈블러(ILAsm.exe))를 사용하고 어셈블리 이름이 MethodAccessException 강력한 경우 지정된 friend 어셈블리가 특성이 포함된 어셈블리에 처음 액세스할 때 예외가 throw됩니다 InternalsVisibleToAttribute .

이 특성을 사용하는 방법에 대한 자세한 내용은 Friend 어셈블리C++ friend 어셈블리를 참조하세요.

전체 공개 키 가져오기

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

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

    Sn -p snk_file outfile

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

    Sn - tpoutfile

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

C를 사용하여 friend 어셈블리 컴파일

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

C++를 사용하여 friend 어셈블리 컴파일

C++에서 특성에서 사용하도록 설정된 InternalsVisibleToAttribute 내부 멤버를 friend 어셈블리에 액세스할 수 있도록 하려면 C++ 지시문에서 특성을 사용해야 as_friend 합니다. 자세한 내용은 Friend 어셈블리(C++)를 참조하세요.

생성자

InternalsVisibleToAttribute(String)

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

속성

AllInternalsVisible

이 속성이 구현되지 않습니다.

AssemblyName

internal 키워드로 표시된 모든 형식 및 형식 멤버가 표시되도록 지정할 friend 어셈블리의 이름을 가져옵니다.

TypeId

파생 클래스에서 구현된 경우 이 Attribute에 대한 고유 식별자를 가져옵니다.

(다음에서 상속됨 Attribute)

메서드

Equals(Object)

이 인스턴스가 지정된 개체와 같은지를 나타내는 값을 반환합니다.

(다음에서 상속됨 Attribute)
GetHashCode()

이 인스턴스의 해시 코드를 반환합니다.

(다음에서 상속됨 Attribute)
GetType()

현재 인스턴스의 Type을 가져옵니다.

(다음에서 상속됨 Object)
IsDefaultAttribute()

파생 클래스에서 재정의된 경우 이 인스턴스 값이 파생 클래스에 대한 기본값인지 여부를 표시합니다.

(다음에서 상속됨 Attribute)
Match(Object)

파생 클래스에서 재정의된 경우 이 인스턴스가 지정된 개체와 같은지 여부를 나타내는 값을 반환합니다.

(다음에서 상속됨 Attribute)
MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)

명시적 인터페이스 구현

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

이름 집합을 해당하는 디스패치 식별자 집합에 매핑합니다.

(다음에서 상속됨 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

인터페이스의 형식 정보를 가져오는 데 사용할 수 있는 개체의 형식 정보를 검색합니다.

(다음에서 상속됨 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

개체에서 제공하는 형식 정보 인터페이스의 수를 검색합니다(0 또는 1).

(다음에서 상속됨 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

개체에서 노출하는 메서드와 속성에 대한 액세스를 제공합니다.

(다음에서 상속됨 Attribute)

적용 대상