Přátelská sestavení
Známé sestavení je sestavení, které má přístup k interním typům a členům jiného sestavení (C#) nebo Friend (Visual Basic). Pokud do AssemblyA přidáte atribut sestavení, který identifikuje SestaveníB jako přátelské sestavení, už nemusíte označit typy a členy v AssemblyA jako veřejné, aby k nim měl přístup SestaveníB. To je zvlášť vhodné v následujících scénářích:
Při testování jednotek při spuštění testovacího kódu v samostatném sestavení, ale vyžaduje přístup k členům v sestavení, které se testují, které jsou označené jako
internal
v jazyce C# neboFriend
v jazyce Visual Basic.Při vývoji knihovny tříd a přidání do knihovny jsou obsaženy v samostatných sestaveních, ale vyžadují přístup k členům v existujících sestaveních, která jsou označena jako
internal
v jazyce C# neboFriend
v jazyce Visual Basic.
Poznámky
Atribut můžete použít InternalsVisibleToAttribute k identifikaci jednoho nebo více přátelských sestavení pro dané sestavení. Následující příklad používá InternalsVisibleToAttribute atribut v AssemblyA a určuje sestavení AssemblyB jako přátelské sestavení sestavení. To dává sestavení SestaveníB přístup ke všem typům a členům sestavení A , které jsou označené jako internal
v jazyce C# nebo Friend
v jazyce Visual Basic.
Poznámka:
Při kompilaci sestavení, jako je AssemblyB, který bude přistupovat k interním typům nebo interním členům jiného sestavení, jako je AssemblyA, je nutné explicitně zadat název výstupního souboru (.exe nebo .dll) pomocí možnosti kompilátoru -out. To je povinné, protože kompilátor ještě negeneroval název sestavení, které sestavuje v době, kdy je vázán na externí odkazy. Další informace najdete v tématu OutputAssembly (C#) nebo -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
Pouze sestavení, která explicitně zadáte jako přátelé, mají přístup k typům internal
a členům (C#) nebo Friend
(Visual Basic). Pokud je například SestaveníB přítelem sestavení A a sestavení C odkazuje na AssemblyB, sestavení C nemá přístup k internal
typům (C#) nebo Friend
(Visual Basic) v sestavení A.
Kompilátor provede základní ověření názvu známého sestavení předaného atributu InternalsVisibleToAttribute . Pokud sestavení A deklaruje SestaveníB jako přátelské sestavení, ověřovací pravidla jsou následující:
Pokud je sestavení A silné s názvem, musí být sestaveníB také silné. Název známého sestavení, který je předán atributu, se musí skládat z názvu sestavení a veřejného klíče klíče silného názvu, který se používá k podepsání AssemblyB.
Název známého sestavení, který je předán atributu InternalsVisibleToAttribute , nemůže být silným názvem AssemblyB. Nezahrnujte verzi sestavení, jazykovou verzi, architekturu ani token veřejného klíče.
Pokud sestavení A není silné, název sestavení přítele by se měl skládat pouze z názvu sestavení. Další informace naleznete v tématu Postupy: Vytvoření nepodepsaných přátelských sestavení.
Pokud je sestaveníB silné pojmenované, je nutné zadat klíč silného názvu pro AssemblyB pomocí nastavení projektu nebo možnosti kompilátoru příkazového řádku
/keyfile
. Další informace naleznete v tématu Postupy: Vytvoření podepsaných přátelských sestavení.
Třída StrongNameIdentityPermission také poskytuje možnost sdílet typy s následujícími rozdíly:
StrongNameIdentityPermission platí pro jednotlivé typy, zatímco známé sestavení platí pro celé sestavení.
Pokud jsou v sestavení A stovky typů, které chcete sdílet s AssemblyB, musíte je přidat StrongNameIdentityPermission do všech. Pokud používáte známé sestavení, stačí deklarovat vztah přítele jen jednou.
Pokud použijete StrongNameIdentityPermission, typy, které chcete sdílet, musí být deklarovány jako veřejné. Pokud používáte známé sestavení, sdílené typy jsou deklarovány jako
internal
(C#) neboFriend
(Visual Basic).
Informace o tom, jak získat přístup k typům a metodám sestavení internal
(C#) nebo Friend
(Visual Basic) ze souboru modulu (soubor s příponou .netmodule), najdete v tématu ModuleAssemblyName (C#) nebo -moduleassemblyname (Visual Basic).