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# nebo Friend 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# nebo Friend 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#) nebo Friend (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).

Viz také