Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Сборка-друг — это сборка, которая имеет доступ к внутренним типам и членам другой сборки (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).