Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сборка-друг — это сборка, которая имеет доступ к внутренним типам и членам другой сборки (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).