Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому 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). Для этого выполните следующие действия.
Извлеките открытый ключ из файла строго именованного ключа в отдельный файл.
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++).