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
Атрибуты

Примеры

Подписанные сборки

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

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

Конструкторы

Имя Описание
InternalsVisibleToAttribute(String)

Инициализирует новый экземпляр InternalsVisibleToAttribute класса с именем указанной сборки друга.

Свойства

Имя Описание
AllInternalsVisible

Это свойство не реализовано.

AssemblyName

Получает имя дружественной сборки, в которую должны отображаться все типы и члены типов, помеченные internal ключевым словом.

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)

Применяется к