Дружественные сборки (C# и Visual Basic)
Дружественная сборка представляет собой сборку, которая может обращаться к типам и членам Friend (Visual Basic) или internal (C#) другой сборки. Если сборка определена как дружественная, больше нет необходимости помечать типы и члены как public для того, чтобы другие сборки имели к ним доступ. Это особенно удобно в следующих случаях:
Во время модульного тестирования код теста выполняется в отдельной сборке, но ему требуется доступ к членам в тестируемой сборке, которые помечены как Friend (Visual Basic) или internal (C#).
Если разрабатывается библиотека классов, и дополнения к библиотеке содержатся в отдельных сборках, но требуют доступа к членам в существующих сборках, которые помечены как Friend (Visual Basic) или internal (C#).
Примечания
Можно использовать атрибут InternalsVisibleToAttribute для идентификации одной или нескольких сборок дружественных для данной сборки. В следующем примере используется атрибут InternalsVisibleToAttribute в сборке A, а в качестве дружественной сборки задается сборка AssemblyB. Это позволяет сборке AssemblyB обращаться ко всем типам и членам в сборке A, которые помечены как Friend (Visual Basic) или internal (C#).
Примечание
При компиляции сборки (сборка AssemblyB), которая будет обращаться к внутренним типам и членам другой сборки (сборка A), необходимо явным образом указывать имя выходного файла (EXE или DLL) с помощью параметра компилятора /out.Это необходимо, потому что компилятор еще не создал имени конструируемой сборки в момент выполнения привязки к внешним ссылкам.Дополнительные сведения см. в разделах /out (C#) и /out (Visual Basic).
Imports System.Runtime.CompilerServices
Imports System
<Assembly: InternalsVisibleTo("AssemblyB")>
' Friend class.
Friend Class FriendClass
Public Sub Test()
Console.WriteLine("Sample Class")
End Sub
End Class
' Public class with a Friend method.
Public Class ClassWithFriendMethod
Friend Sub Test()
Console.WriteLine("Sample Method")
End Sub
End Class
using System.Runtime.CompilerServices;
using System;
[assembly: InternalsVisibleTo("AssemblyB")]
// The class is internal by default.
class FriendClass
{
public void Test()
{
Console.WriteLine("Sample Class");
}
}
// Public class that has an internal method.
public class ClassWithFriendMethod
{
internal void Test()
{
Console.WriteLine("Sample Method");
}
}
Только сборки, которые явным образом указаны как дружественные, могут обращаться к типам и членам Friend (Visual Basic) или internal (C#). Например, если сборка B является дружественной для сборки A и сборка C ссылается на сборку B, у сборки C нет доступа к типам Friend (Visual Basic) и internal (C#) в сборке A.
Компилятор выполняет некоторые основные проверки имени дружественной сборки, передаваемой атрибуту InternalsVisibleToAttribute. Если сборка A объявляет B как дружественную сборку, правила проверки следующие:
В случае строгого имени сборки A сборка B также должна иметь строгое имя. Имя дружественной сборки, которая передается атрибуту, должно состоять из имени сборки и открытого ключа строгого имени, который используется для подписи сборки B.
Имя дружественной сборки, которая передается атрибуту InternalsVisibleToAttribute не может быть строгим именем сборки B, за исключением версии сборки, языка и региональных параметров, архитектуры или маркера открытого ключа.
Если сборка A не имеет строгого имени, имя дружественной сборки должно состоять только из имени сборки. Дополнительные сведения см. в разделе Практическое руководство. Создание неподписанных дружественных сборок (C# и Visual Basic).
Если сборка B имеет строгое имя, необходимо указать ключ строгого имени для сборки B с помощью параметра проекта или параметра компилятора командной строки /keyfile. Дополнительные сведения см. в разделе Практическое руководство. Создание подписанных дружественных сборок (C# и Visual Basic).
Класс StrongNameIdentityPermission также предоставляет возможность совместного использования типов, но со следующими отличиями.
StrongNameIdentityPermission применяется к отдельному типу, а дружественная сборка применяется ко всей сборке.
Если в сборке A имеются сотни типов, которые требуется совместно использовать со сборкой B, необходимо добавить разрешение StrongNameIdentityPermission ко всем этим типам. Если используется дружественная сборка, достаточно один раз объявить дружественные отношения.
При использовании разрешения StrongNameIdentityPermission типы, которые необходимо совместно использовать, должны быть объявлены как открытые. При использовании дружественной сборки общие типы объявляются с использованием ключевых слов Friend (Visual Basic) и internal (C#).
Сведения об обращении к типам и методам Friend (Visual Basic) и internal (C#) сборки из файла модуля (файла с расширением netmodule) см. в разделах /moduleassemblyname (Visual Basic) и /moduleassemblyname (C#).
См. также
Задачи
Практическое руководство. Создание неподписанных дружественных сборок (C# и Visual Basic)
Практическое руководство. Создание подписанных дружественных сборок (C# и Visual Basic)
Ссылки
Основные понятия
Сборки и глобальный кэш сборок (C# и Visual Basic)
Руководство по программированию на C#