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


Дружественные сборки

Сборка-друг — это сборка, которая имеет доступ к внутренним типам и членам другой сборки (C#) или «Friend» (Visual Basic). Если добавить атрибут сборки в AssemblyA, чтобы определить AssemblyB как дружественную сборку, вам больше не нужно отмечать типы и члены в AssemblyA как общедоступные для доступа к ним из AssemblyB. Это особенно удобно в следующих сценариях:

  • Во время модульного тестирования, когда тестовый код выполняется в отдельной сборке, но при этом требуется доступ к элементам в тестируемой сборке, которые помечены как internal в C# или Friend в Visual Basic.

  • При разработке библиотеки классов и дополнения к библиотеке содержатся в отдельных сборках, но требуют доступа к элементам в существующих сборках, помеченных как internal в C# или Friend в Visual Basic.

Замечания

Вы можете использовать атрибут InternalsVisibleToAttribute для идентификации одной или нескольких дружественных сборок для данной сборки. В следующем примере атрибут InternalsVisibleToAttribute используется в AssemblyA и сборка AssemblyB указана в качестве дружественной сборки. Это позволяет сборке AssemblyB получать доступ ко всем типам и членам сборки A , помеченным как internal в C# или Friend Visual Basic.

Замечание

При компиляции сборки, такой как AssemblyB , которая будет получать доступ к внутренним типам или внутренним членам другой сборки, например AssemblyA, необходимо явно указать имя выходного файла (.exe или .dll) с помощью параметра компилятора -out . Это необходимо, так как компилятор еще не создал имя сборки, созданной в то время, когда она привязана к внешним ссылкам. Дополнительные сведения см. в разделе OutputAssembly (C#) или -out (Visual Basic).

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");
    }

}
Imports System.Runtime.CompilerServices
<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

Только те сборки, которые вы явно указываете как дружественные, могут получать доступ к internal типам и членам (C#) или Friend (Visual Basic). Например, если AssemblyB является другом сборки A и сборки C ссылается на AssemblyB, сборка C не имеет доступа к internal типам (C#) или Friend (Visual Basic) в сборке A.

Компилятор выполняет некоторую базовую проверку имени дружественной сборки, переданной атрибуту InternalsVisibleToAttribute . Если сборка A декларирует AssemblyB в качестве дружественной сборки, правила проверки следующие:

  • Если сборка A имеет строгое имя, сборка B также должна иметь строгое имя. Имя дружественной сборки, переданное атрибуту, должно состоять из имени сборки и открытого ключа строгого имени, который используется для подписи AssemblyB.

    Имя дружественной сборки, передаваемое InternalsVisibleToAttribute атрибуту, не может быть строгим именем AssemblyB. Не включать версию сборки, язык и региональные параметры, архитектуру или маркер открытого ключа.

  • Если сборка A не имеет строгого имени, имя дружественной сборки должно состоять только из имени сборки. Дополнительные сведения см. в разделе "Создание неподписанных дружественных сборок".

  • Если AssemblyB имеет строгое имя, необходимо указать ключ строгого имени для AssemblyB с помощью параметра проекта или параметра компилятора командной строки /keyfile . Если вам нужна дополнительная информация, см. Как создать подписанные дружественные сборки.

Класс StrongNameIdentityPermission также предоставляет возможность совместного использования типов со следующими различиями:

  • StrongNameIdentityPermission применяется к отдельному типу, а дружественная сборка применяется на всю сборку.

  • Если в сборке A есть сотни типов, которыми вы хотите поделиться с AssemblyB, необходимо добавить StrongNameIdentityPermission ко всем из них. Если вы используете дружественную сборку, вам нужно только один раз объявить о дружественных отношениях.

  • Если вы используете StrongNameIdentityPermission, типы, которым необходимо предоставить общий доступ, должны быть объявлены как общедоступные. Если вы используете другую сборку, общие типы объявляются как internal (C#) или Friend (Visual Basic).

Сведения о том, как получить доступ к типам и методам сборки internal (C#) или Friend (Visual Basic) из файла модуля (файлу с расширением .netmodule), см. в разделе ModuleAssemblyName (C#) или -moduleassemblyname (Visual Basic).

См. также