Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Класс InternalsVisibleToAttribute

 

Опубликовано: Июль 2016

Задает, что типы, видимые обычно только в пределах текущей сборки, являются видимыми для заданной сборки.

Пространство имен:   System.Runtime.CompilerServices
Сборка:  mscorlib (в mscorlib.dll)

System.Object
  System.Attribute
    System.Runtime.CompilerServices.InternalsVisibleToAttribute

[AttributeUsageAttribute(AttributeTargets.Assembly, AllowMultiple = true, 
	Inherited = false)]
public sealed class InternalsVisibleToAttribute : Attribute

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

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

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

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Это свойство не реализовано.

System_CAPS_pubpropertyAssemblyName

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

System_CAPS_pubpropertyTypeId

В случае реализации в производном классе возвращает уникальный идентификатор для этого атрибута Attribute.(Наследуется от Attribute.)

ИмяОписание
System_CAPS_pubmethodEquals(Object)

Этот API поддерживает инфраструктуру продукт, и его не следует использовать напрямую из кода. Возвращает значение, показывающее, равен ли экземпляр указанному объекту.(Наследуется от Attribute.)

System_CAPS_pubmethodGetHashCode()

Возвращает хэш-код данного экземпляра.(Наследуется от Attribute.)

System_CAPS_pubmethodGetType()

Возвращает объект Type для текущего экземпляра.(Наследуется от Object.)

System_CAPS_pubmethodIsDefaultAttribute()

При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса.(Наследуется от Attribute.)

System_CAPS_pubmethodMatch(Object)

При переопределении в производном классе, возвращает значение, указывающее, равен ли данный экземпляр указанному объекту.(Наследуется от Attribute.)

System_CAPS_pubmethodToString()

Возвращает строку, представляющую текущий объект.(Наследуется от Object.)

ИмяОписание
System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации.(Наследуется от Attribute.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Возвращает сведения о типе объекта, которые можно использовать для получения сведений о типе интерфейса.(Наследуется от Attribute.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.GetTypeInfoCount(UInt32)

Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1).(Наследуется от Attribute.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Предоставляет доступ к открытым свойствам и методам объекта.(Наследуется от Attribute.)

Как правило, типы и члены с internal области (в C#) и friend области (в Visual Basic) отображаются только в сборке, в котором они определены. InternalsVisibleToAttribute Атрибут делает их также видимым типам в указанной сборке, которая называется дружественной сборки.

Атрибут применяется на уровне сборки. Это означает, что он может быть включено в начале файла исходного кода или может быть включено в файл AssemblyInfo в проект Visual Studio. Атрибут можно использовать для указания одного дружественной сборки, можно получить доступ к внутренним типам и членам текущей сборки. Можно определить несколько дружественных сборок двумя способами. Они отображаются как отдельные атрибуты уровня сборки, как показано в следующем примере.

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]

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

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]

Дружественные сборки определяется InternalsVisibleToAttribute конструктор. Текущая сборка и дружественной сборки должны быть без знака или обе сборки должны быть подписаны строгим именем.

Если обе сборки без знака, assemblyName аргумент состоит из имени дружественной сборки указано без расширения имени пути или файла каталога.

Если обе сборки должны быть подписаны строгим именем, аргумент InternalsVisibleToAttribute конструктор должен содержать имя сборки без его каталог путь или расширение имени файла, вместе с полного открытого ключа (а не его токеном открытого ключа). Для получения полного открытого ключа сборки со строгими именами см Получение полного открытого ключа далее в этой статье. Дополнительные сведения об использовании InternalsVisibleToAttribute с сборки со строгими именами, в разделе InternalsVisibleToAttribute конструктор.

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

Дополнительные сведения об использовании этого атрибута см. в следующих разделах:

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

  1. Извлечь открытый ключ из файла ключа со строгими именами в отдельный файл:

    Sn -p snk_fileвыходной файл

  2. Для отображения полного открытого ключа на консоль:

    Sn - tp выходной файл

  3. Скопируйте и вставьте значение полного открытого ключа в исходном коде.

Если вы используете компилятор C# для компиляции дружественной сборки, необходимо явно указать имя выходного файла (.exe или .dll) с помощью /out параметр компилятора. Это необходимо потому, что компилятор еще не создал имя сборки, формируемой во время привязки к внешним ссылкам. /Out параметр компилятора является необязательным для компилятора Visual Basic и соответствующие -out или -o не следует использовать параметр компилятора, при компиляции дружественных сборок с помощью компилятора F #.

В C++, чтобы сделать внутренние элементы, включаемые InternalsVisibleToAttribute атрибут доступным для дружественной сборки, необходимо использовать as_friend атрибут в директиве C++. Для получения дополнительной информации см. Дружественные сборки (C++).

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

В следующем примере используется 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;
   }
}

Если следующий пример компилируется в сборку строгим именем с именем Friend1, Example.Main метод в Friend1 успешно можно вызвать FileUtilities.AppendDirectorySeparator метода, несмотря на то, что метод является внутренним для Assembly1 сборки. Обратите внимание, что при компиляции из командной строки на языке 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\

Сборки без подписи

В следующем примере используется 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();
      }
   }
}

The following example provides the source code for the Friend2 assembly. Note that if you are compiling in C# from the command line, you must use the /out compiler switch to ensure that the name of the friend assembly is available when the compiler binds to external references.

using System;
using Utilities.StringUtilities;

public class Example
{
   public static void Main()
   {
      String s = "The Sign of the Four";
      Console.WriteLine(StringLib.IsFirstLetterUpperCase(s));
   }
}

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 2.0
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1

Любые открытые статические элементы ( Предоставлен общий доступ в Visual Basic) этого типа являются потокобезопасными. Потокобезопасность элементов экземпляров не гарантируется.

Вернуться в начало
Показ: