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 для создания метода с именем 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, метод может успешно вызвать Example.Main метод, хотя этот метод Friend1 является внутренним для сборки FileUtilities.AppendDirectorySeparatorAssembly1. При компиляции в C# из командной строки необходимо использовать переключатель компилятора /out , чтобы убедиться, что имя дружественной сборки доступно, когда компилятор привязывается к внешним ссылкам.
//
// 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 = FileUtilities1.AppendDirectorySeparator(dir)
Console.WriteLine(dir)
End Sub
End Module
' The example displays the following output:
' C:\Program Files\
Неподписанные сборки
В следующем примере атрибут используется InternalsVisibleToAttribute для создания internal члена неподписаемой сборки, видимой для другой сборки без знака. Атрибут гарантирует, что internalStringLib.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 System;
public class Example1
{
public static void Main()
{
String s = "The Sign of the Four";
//Console.WriteLine(Utilities.StringUtilities.StringLib.IsFirstLetterUpperCase(s));
}
}
Module Example1
Public Sub Main()
Dim s As String = "The Sign of the Four"
' Console.WriteLine(Utilities.StringUtilities.StringLib.IsFirstLetterUpperCase(s))
End Sub
End Module
Комментарии
Атрибут 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++).
Конструкторы
| Имя | Описание |
|---|---|
| InternalsVisibleToAttribute(String) |
Инициализирует новый экземпляр InternalsVisibleToAttribute класса с именем указанной сборки друга. |
Свойства
| Имя | Описание |
|---|---|
| AllInternalsVisible |
Это свойство не реализовано. |
| AssemblyName |
Получает имя дружественной сборки, в которую должны отображаться все типы и члены типов, помеченные |
| 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) |