Assembly Friend

Un assembly Friend è un assembly che può accedere ai tipi e ai membri interni (C#) o Friend (Visual Basic) di un altro assembly. Se si aggiunge un attributo assembly a AssemblyA per identificare AssemblyB come assembly friend, non è più necessario contrassegnare i tipi e i membri in AssemblyA come pubblico per poter accedere a AssemblyB. Questo metodo è particolarmente utile negli scenari seguenti:

  • Durante il testing unità, quando il codice di test viene eseguito in un assembly separato ma richiede l'accesso ai membri dell'assembly sottoposto a test che sono contrassegnati come internal in C# o come Friend in Visual Basic.

  • Quando si sviluppa una libreria di classi e le aggiunte alla libreria sono contenute in assembly separati ma richiedono l'accesso ai membri degli assembly esistenti che sono contrassegnati come internal in C# o come Friend in Visual Basic.

Osservazioni:

È possibile usare l'attributo InternalsVisibleToAttribute per identificare uno o più assembly Friend per un determinato assembly. Nell'esempio seguente viene usato l'attributo InternalsVisibleToAttribute in AssemblyA e viene specificato assemblyB come assembly friend. In questo modo l'assemblyB può accedere a tutti i tipi e i membri nell'assembly A contrassegnati come internal in C# o Friend in Visual Basic.

Nota

Quando si compila un assembly come AssemblyB che accederà a tipi interni o membri interni di un altro assembly come AssemblyA, è necessario specificare in modo esplicito il nome del file di output (.exe o .dll) usando l'opzione del compilatore -out . Il compilatore non ha infatti ancora generato il nome dell'assembly in fase di compilazione quando crea l'associazione a riferimenti esterni. Per altre informazioni, vedere OutputAssembly (C#) o -out (Visual Basic).For more information, see OutputAssembly (C#) or -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

Solo gli assembly specificati in modo esplicito come amici possono accedere a internal tipi e membri (C#) o Friend (Visual Basic). Ad esempio, se AssemblyB è un elemento Friend dell'assembly A e l'assembly C fa riferimento a AssemblyB, Assembly C non ha accesso a internal tipi (C#) o Friend (Visual Basic) nell'assembly A.

Il compilatore esegue alcune operazioni di convalida di base del nome dell'assembly Friend che viene passato all'attributo InternalsVisibleToAttribute. Se Assembly A dichiara AssemblyB come assembly friend, le regole di convalida sono le seguenti:

  • Se Assembly A è sicuro denominato, AssemblyB deve anche essere denominato sicuro. Il nome dell'assembly friend passato all'attributo deve essere costituito dal nome dell'assembly e dalla chiave pubblica della chiave con nome sicuro usata per firmare AssemblyB.

    Il nome dell'assembly friend passato all'attributo InternalsVisibleToAttribute non può essere il nome sicuro di AssemblyB. Non includere la versione dell'assembly, le impostazioni cultura, l'architettura o il token di chiave pubblica.

  • Se assembly A non è sicuro denominato, il nome dell'assembly friend deve essere costituito solo dal nome dell'assembly. Per altre informazioni, vedere Procedura: Creare assembly Friend non firmati.

  • Se AssemblyB è un nome sicuro, è necessario specificare la chiave con nome sicuro per AssemblyB usando l'impostazione del progetto o l'opzione del compilatore della riga di comando /keyfile . Per altre informazioni, vedere Procedura: Creare assembly Friend firmati.

La classe StrongNameIdentityPermission consente anche la condivisione dei tipi, con le differenze seguenti:

  • StrongNameIdentityPermission si applica a un singolo tipo, mentre un assembly Friend si applica all'intero assembly.

  • Se nell'assembly A sono presenti centinaia di tipi da condividere con AssemblyB, è necessario aggiungerli StrongNameIdentityPermission a tutti. Se invece si usa un assembly Friend, è sufficiente dichiarare una volta che si tratta di una relazione di tipo Friend.

  • Se si usa StrongNameIdentityPermission, i tipi da condividere devono essere dichiarati come pubblici. Se si usa un assembly Friend, i tipi condivisi vengono dichiarati come internal (C#) o Friend (Visual Basic).

Per informazioni su come accedere ai tipi e ai metodi di internal un assembly (C#) o Friend (Visual Basic) da un file di modulo (un file con estensione .netmodule ), vedere ModuleAssemblyName (C#) o -moduleassemblyname (Visual Basic).

Vedi anche