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


Дружественные сборки (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)

Ссылки

InternalsVisibleToAttribute

StrongNameIdentityPermission

Основные понятия

Сборки и глобальный кэш сборок (C# и Visual Basic)

Руководство по программированию на C#

Другие ресурсы

Руководство по программированию на Visual Basic