Sdílet prostřednictvím


Přátelská sestavení

Známé sestavení je sestavení, které má přístup k typům a členům z jiného sestavení, označeným jako internal v C# nebo Friend ve Visual Basicu. 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, kdy je testovací kód spuštěn v samostatném sestavení, ale vyžaduje přístup k členům v sestavení, které se testuje, jež jsou označené jako internal v jazyce C# nebo Friend v jazyce Visual Basic.

  • Při vývoji knihovny tříd, kdy jsou doplňky do knihovny umístěny 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

Můžete použít atribut 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 AssemblyB jako přátelské 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, musíte 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ě určíte jako přátele, mají přístup k typům a členům (C#) nebo (Visual Basic) internal a Friend. 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 přátelského sestavení, který je předán atributu InternalsVisibleToAttribute. Pokud sestavení A deklaruje SestaveníB jako přátelské sestavení, ověřovací pravidla jsou následující:

  • Pokud je sestavení A silně pojmenované, musí být sestavení B také silně pojmenované. 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 silného názvu, který se používá k podepsání AssemblyB.

    Název přátelského sestavení, který je předán atributu InternalsVisibleToAttribute, nemůže být silným názvem AssemblyB. Nezahrnujte verzi sestavení, kulturní nastavení, architekturu nebo token veřejného klíče.

  • Pokud sestavení A není opatřeno silným názvem, název přátelského sestavení by se měl skládat pouze z názvu sestavení. Podrobnosti naleznete v Jak na to: 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 volby kompilátoru pro příkazový řádek /keyfile. Další informace naleznete v tématu Jak: Vytvořit podepsaná přátelská sestavení.

Třída StrongNameIdentityPermission také poskytuje možnost sdílet typy s následujícími rozdíly:

  • StrongNameIdentityPermission platí pro jednotlivý typ, zatímco přátelské sestavení platí pro celou sestavu.

  • 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 přátelské 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 přátelské 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é