Поделиться через


Класс System.Runtime.CompilerServices.InternalsVisibleToAttribute

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Атрибут InternalsVisibleToAttribute указывает, что типы, которые обычно видны только в текущей сборке, видны указанной сборке.

Обычно типы и члены с 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 -tp <outfile>

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

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

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

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

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