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 в подписанной сборке, видимой для другой подписанной сборки. Он определяет FileUtilities класс, включающий внутренний AppendDirectorySeparator метод. Атрибут 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, метод может Friend1 успешно вызвать FileUtilities.AppendDirectorySeparator метод, хотя этот метод является внутренним для сборки Assembly1 Example.Main. Обратите внимание, что при компиляции в C# из командной строки необходимо использовать параметр компилятора /out , чтобы убедиться, что имя дружественной сборки доступно при привязке компилятора к внешним ссылкам.

//
// 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 члена неподписаемой сборки, видимой для другой сборки без знака. Атрибут гарантирует, что 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 , чтобы убедиться, что имя дружественной сборки доступно при привязке компилятора к внешним ссылкам.

#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

Комментарии

Как правило, типы и члены с internal областью в C# или Friend области в Visual Basic видны только в сборке, в которой они определены. Типы и члены с protected internal областью (Protected Friendобластью в Visual Basic) видны только в собственной сборке или в типах, производных от их содержащего класса. Типы и члены с private protected областью (Private Protectedобласть в Visual Basic) видны в содержающем классе или в типах, производных от их содержащего класса в текущей сборке

Атрибут InternalsVisibleToAttribute делает эти типы и члены также видимыми для типов в указанной сборке, которая называется дружественной сборкой. Это относится только к internal (Friendв Visual Basic), protected internal(Protected Friendв Visual Basic) и private protected (Private Protectedв Visual Basic) членам, но не private к членам.

Примечание

В случае private protected членов InternalsVisibleToAttribute (Private Protectedв Visual Basic) атрибут расширяет специальные возможности только для типов, производных от содержащего класса элемента.

Атрибут применяется на уровне сборки. Это означает, что его можно включить в начало файла исходного кода или включить в файл AssemblyInfo в проект Visual Studio. С помощью атрибута можно указать одну другую сборку, которая может получить доступ к внутренним типам и членам текущей сборки. Можно определить несколько дружественных сборок двумя способами. Они могут отображаться как отдельные атрибуты уровня сборки, как показано в следующем примере.

[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")>

Другая сборка идентифицируется конструктором InternalsVisibleToAttribute . Текущая сборка и другая сборка должны быть без знака, или обе сборки должны быть подписаны строгим именем.

Если обе сборки не подписаны, assemblyName аргумент состоит из имени дружественной сборки, указанной без пути к каталогу или расширения имени файла.

Если обе сборки подписаны строгим именем, аргумент InternalsVisibleToAttribute конструктора должен состоять из имени сборки без пути к каталогу или расширения имени файла, а также полного открытого ключа (а не маркера открытого ключа). Чтобы получить полный открытый ключ сборки со строгим именем, см. раздел "Получение полного открытого ключа " далее в этой статье. Дополнительные сведения об использовании InternalsVisibleToAttribute со сборками со строгими именами см. в конструкторе InternalsVisibleToAttribute .

Не включайте значения для CultureInfoVersionполя или ProcessorArchitecture поля в аргумент; компиляторы Visual Basic, C# и C++ обрабатывают это как ошибку компилятора. Если вы используете компилятор, который не обрабатывает его как ошибку (например, сборщик IL (ILAsm.exe)) и сборки имеют строгое имя, создается исключение при MethodAccessException первом обращении к сборке, содержащей InternalsVisibleToAttribute атрибут.

Дополнительные сведения об использовании этого атрибута см. в разделе "Дружественные сборки " и "Дружественные сборки C++".

Получение полного открытого ключа

Средство строгого имени (Sn.exe) можно использовать для получения полного открытого ключа из файла строго именованного ключа (SNK). Для этого выполните следующие действия.

  1. Извлеките открытый ключ из файла ключа со строгим именем в отдельный файл:

    Sn -p snk_file outfile

  2. Отображение полного открытого ключа в консоли:

    Sn - tpoutfile

  3. Скопируйте и вставьте полное значение открытого ключа в исходный код.

Компиляция дружественной сборки с помощью C

При использовании компилятора C# для компиляции дружественной сборки необходимо явно указать имя выходного файла (.exe или .dll) с помощью параметра компилятора /out . Это необходимо потому, что компилятор еще не создал имя сборки, формируемой во время привязки к внешним ссылкам. Параметр компилятора /out является необязательным для компилятора Visual Basic, а соответствующий параметр компилятора -out или -o не следует использовать при компиляции дружественных сборок с компилятором F#.

Компиляция дружественной сборки с помощью C++

В C++, чтобы сделать внутренние члены доступными для InternalsVisibleToAttribute дружественной сборки, необходимо использовать as_friend атрибут в директиве C++. Дополнительные сведения см. в разделе "Дружественные сборки" (C++).

Конструкторы

InternalsVisibleToAttribute(String)

Инициализирует новый экземпляр класса InternalsVisibleToAttribute с именем заданной дружественной сборки.

Свойства

AllInternalsVisible

Это свойство не реализовано.

AssemblyName

Получает имя дружественной сборки, для которой будут сделаны доступными все типы и члены типов, помеченные ключевым словом internal.

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)

Применяется к