Condividi tramite


Assembly amiche

Un friend assembly è 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 amico, non è più necessario contrassegnare i tipi e i membri in AssemblyA come pubblici affinché possano essere accessibili da AssemblyB. Ciò è particolarmente utile negli scenari seguenti:

  • Durante gli unit test, quando il codice di test viene eseguito in un assembly separato, ma richiede l'accesso ai membri dell'assembly da testare contrassegnati come internal in C# o 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 negli assembly esistenti contrassegnati come internal in C# o 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 amico. In questo modo Assembly B può accedere a tutti i tipi e i membri in Assembly A contrassegnati come internal in C# o Friend in Visual Basic.

Annotazioni

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 . Questa operazione è necessaria perché il compilatore non ha ancora generato il nome per l'assembly che sta compilando al momento dell'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 che specifichi esplicitamente come amici possono accedere ai tipi e ai membri di internal (C#) o Friend (Visual Basic). Ad esempio, se AssemblyB è dichiarato come "friend" dell'Assembly A e Assembly C fa riferimento a AssemblyB, Assembly C non ha accesso ai tipi (C#) o (Visual Basic) definiti in internal.

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

  • Se Assembly A è a nome sicuro, AssemblyB deve essere anch'esso a nome 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, la cultura, l'architettura o il token della chiave pubblica.

  • Se Assembly A non è "strong named", il nome dell'assembly amico deve essere costituito solo dal nome dell'assembly. Per ulteriori dettagli, consulta Come creare assembly friend non firmati.

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

La StrongNameIdentityPermission classe offre anche la possibilità di condividere i tipi, con le differenze seguenti:

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

  • Se nell'assembly A sono presenti centinaia di tipi da condividere con AssemblyB, è necessario aggiungerli StrongNameIdentityPermission a tutti. Se si usa un assembly amico, si deve dichiarare la relazione una sola volta.

  • 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).

Vedere anche