Прочитать на английском

Поделиться через


InternalsVisibleToAttribute Класс

Определение

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

[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
public sealed class InternalsVisibleToAttribute : 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;
   }
}

Если следующий пример компилируется в сборку с строгим именем 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();
      }
   }
}

В следующем примере представлен исходный код для сборки Friend2. Обратите внимание, что при компиляции в C# из командной строки необходимо использовать переключатель компилятора /out, чтобы убедиться, что имя дружественной сборки доступно при привязке компилятора к внешним ссылкам.

using System;
using Utilities.StringUtilities;

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

Комментарии

Дополнительные сведения об этом API см. в дополнительных примечаниях API для InternalsVisibleToAttribute.

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

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)

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

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0