Класс 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). Для этого выполните следующие действия.
Извлеките открытый ключ из файла ключа с строгим именем в отдельный файл:
Sn -p <snk_file> <outfile>
Отображение полного открытого ключа в консоли:
Sn -tp <outfile>
Скопируйте и вставьте полное значение открытого ключа в исходный код.
Компиляция дружественной сборки с помощью C#
При использовании компилятора C# для компиляции дружественной сборки необходимо явно указать имя выходного файла (.exe или .dll) с помощью параметра компилятора /out . Это необходимо потому, что компилятор еще не создал имя сборки, формируемой во время привязки к внешним ссылкам. Параметр компилятора /out необязателен для компилятора Visual Basic, а соответствующий параметр компилятора -out или -o не должен использоваться при компиляции дружественных сборок с помощью компилятора F#.
Компиляция дружественной сборки с помощью C++
В C++, чтобы сделать внутренние члены включенными атрибутом InternalsVisibleToAttribute в другую сборку, необходимо использовать as_friend
атрибут в директиве C++. Дополнительные сведения см. в разделе "Дружественные сборки" (C++).