Assembly Friend (C# e Visual Basic)
Un assembly Friend è un assembly che può accedere a tipi e membri Friend (Visual Basic) o internal (C#) di un altro assembly. Se si identifica un assembly come assembly Friend, non è più necessario contrassegnare tipi e membri come pubblici per accedere ad essi da altri assembly. Questo è particolarmente utile negli scenari seguenti:
Durante gli unit test, quando il codice del test è in esecuzione in un assembly separato ma richiede l'accesso ai membri dell'assembly testato che è contrassegnato come Friend (Visual Basic) o internal (C#).
Durante lo sviluppo di una libreria di classi, quando le aggiunte alla libreria sono contenute in assembly separati ma richiedono l'accesso ai membri di assembly esistenti contrassegnati come Friend (Visual Basic) o internal (C#).
Note
Si utilizza l'attributo InternalsVisibleToAttribute per identificare uno o più assembly Friend per un determinato assembly. Nell'esempio seguente viene utilizzato l'attributo InternalsVisibleToAttribute nell'assembly A e specificato l'assembly AssemblyB come assembly Friend. In questo modo l'assembly AssemblyB può accedere a tutti i tipi e i membri dell'assembly A contrassegnati come Friend (Visual Basic) o internal (C#).
Nota
Quando si compila un assembly (assembly AssemblyB) che accederà ai tipi o ai membri interni di un altro assembly (assembly A), è necessario specificare in modo esplicito il nome del file di output (exe o dll) utilizzando l'opzione del compilatore /out perché il compilatore non ha ancora generato il nome dell'assembly che sta generando nel momento in cui esegue l'associazione a riferimenti esterni. Per ulteriori informazioni, vedere /out (C#) e /out (Visual Basic).
Imports System.Runtime.CompilerServices
Imports System
<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
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");
}
}
Solo assembly specificati in modo esplicito come Friend possono accedere ai tipi e ai membri Friend (Visual Basic) o internal (C#). Ad esempio, se l'assembly B è Friend per l'assembly A e l'assembly C fa riferimento all'assembly B, C non ha accesso ai tipi Friend (Visual Basic) o internal (C#) in A.
Il compilatore esegue alcune convalide di base del nome dell'assembly Friend passato all'attributo InternalsVisibleToAttribute. Se l'assembly A dichiara B come assembly Friend, le regole di convalida sono le seguenti:
Se assembly A possiede un nome sicuro, anche l'assembly B deve avere un 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 utilizzata per firmare l'assembly B.
Il nome dell'assembly Friend passato all'attributo InternalsVisibleToAttribute non può essere il nome sicuro dell'assembly B: non includono la versione dell'assembly, le impostazioni cultura, l'architettura, o il token di chiave pubblica.
Se l'assembly A non dispone di un nome sicuro, il nome dell'assembly Friend deve essere costituito solo dal nome dell'assembly. Per ulteriori informazioni, vedere Procedura: creare assembly Friend non firmati (C# e Visual Basic).
Se l'assembly B ha un nome sicuro, è necessario specificare la chiave con nome sicuro per l'assembly B utilizzando l'impostazione di progetto o l'opzione del compilatore /keyfile della riga di comando. Per ulteriori informazioni, vedere Procedura: creare assembly Friend firmati (C# e Visual Basic).
Anche la classe StrongNameIdentityPermission consente di condividere tipi, con le seguenti differenze:
StrongNameIdentityPermission si applica a un singolo tipo, mentre un assembly friend è valido per l'intero assembly.
Se nell'assembly A sono presenti centinaia di tipi che si desidera condividere con l'assembly B, è necessario aggiungere StrongNameIdentityPermission a tutti. Se si utilizza un assembly Friend, è sufficiente dichiarare la relazione Friend una volta sola.
Se si utilizza StrongNameIdentityPermission, i tipi da condividere devono essere dichiarati pubblici. Se si utilizza un assembly Friend, i tipi condivisi sono dichiarati Friend (Visual Basic) o internal (C#).
Per informazioni sull'accesso ai tipi e ai membri Friend (Visual Basic) o internal (C#) di un assembly da un file di modulo (un file con estensione netmodule), vedere /moduleassemblyname (Visual Basic) e /moduleassemblyname (C#).
Vedere anche
Attività
Procedura: creare assembly Friend non firmati (C# e Visual Basic)
Procedura: creare assembly Friend firmati (C# e Visual Basic)
Riferimenti
Concetti
Assembly e Global Assembly Cache (C# e Visual Basic)