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


Класс 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 (Private Protected в Visual Basic) атрибут InternalsVisibleToAttribute расширяет доступ только для типов, производных от содержащего класса этого члена.

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

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

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

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

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

  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++).