Assembly FriendFriend assemblies

Un assembly Friend può accedere ai tipi e ai membri internal (C#) o Friend (Visual Basic) di un altro assembly.A friend assembly is an assembly that can access another assembly's internal (C#) or Friend (Visual Basic) types and members. Se un assembly viene riconosciuto di tipo Friend, non è più necessario contrassegnare tipi e membri come pubblici perché altri assembly possano accedervi.If you identify an assembly as a friend assembly, you no longer have to mark types and members as public in order for them to be accessed by other assemblies. Questo metodo è particolarmente utile negli scenari seguenti:This is especially convenient in the following scenarios:

  • 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.During unit testing, when test code runs in a separate assembly but requires access to members in the assembly being tested that are marked as internal in C# or 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.When you are developing a class library and additions to the library are contained in separate assemblies but require access to members in existing assemblies that are marked as internal in C# or Friend in Visual Basic.

NoteRemarks

È possibile usare l'attributo InternalsVisibleToAttribute per identificare uno o più assembly Friend per un determinato assembly.You can use the InternalsVisibleToAttribute attribute to identify one or more friend assemblies for a given assembly. Nell'esempio seguente viene usato l'attributo InternalsVisibleToAttribute nell' assembly a e viene specificato AssemblyB dell'assembly come assembly Friend.The following example uses the InternalsVisibleToAttribute attribute in Assembly A and specifies assembly AssemblyB as a friend assembly. In questo modo l'assembly AssemblyB l'accesso a tutti i tipi e membri nell' assembly a contrassegnati come C# internal in o Friend Visual Basic.This gives assembly AssemblyB access to all types and members in Assembly A that are marked as internal in C# or Friend in Visual Basic.

Nota

Quando si compila un assembly come AssemblyB che accede ai tipi interni o ai membri interni di un altro assembly come assembly A, è necessario specificare in modo esplicito il nome del file di output (conestensione exe o dll) utilizzando l'opzione -out del compilatore.When you compile an assembly like AssemblyB that will access internal types or internal members of another assembly like Assembly A, you must explicitly specify the name of the output file (.exe or .dll) by using the -out compiler option. Il compilatore non ha infatti ancora generato il nome dell'assembly in fase di compilazione quando crea l'associazione a riferimenti esterni.This is required because the compiler has not yet generated the name for the assembly it is building at the time it is binding to external references. Per ulteriori informazioni, vedere -out (C#) o -out (Visual Basic).For more information, see -out (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 aiC#tipi e ai membri di internal () o Friend (Visual Basic).Only assemblies that you explicitly specify as friends can access internal (C#) or Friend (Visual Basic) types and members. Ad esempio, se AssemblyB è un elemento Friend dell' assembly a e l' assembly c fa riferimento a AssemblyB, l' assembly c non haC#accesso ai tipi internal () o Friend (Visual Basic) nell' assembly a.For example, if AssemblyB is a friend of Assembly A and Assembly C references AssemblyB, Assembly C does not have access to internal (C#) or Friend (Visual Basic) types in Assembly A.

Il compilatore esegue alcune operazioni di convalida di base del nome dell'assembly Friend che viene passato all'attributo InternalsVisibleToAttribute.The compiler performs some basic validation of the friend assembly name passed to the InternalsVisibleToAttribute attribute. Se l' assembly A dichiara AssemblyB come assembly Friend, le regole di convalida sono le seguenti:If Assembly A declares AssemblyB as a friend assembly, the validation rules are as follows:

  • Se l'assembly A è con nome sicuro, AssemblyB deve anche essere con nome sicuro.If Assembly A is strong named, AssemblyB must also be strong named. Il nome dell'assembly Friend che viene passato all'attributo deve essere costituito dal nome dell'assembly e dalla chiave pubblica della chiave con nome sicuro usata per firmare AssemblyB.The friend assembly name that is passed to the attribute must consist of the assembly name and the public key of the strong-name key that is used to sign AssemblyB.

    Il nome dell'assembly Friend passato all'attributo InternalsVisibleToAttribute non può essere il nome sicuro AssemblyB.The friend assembly name that is passed to the InternalsVisibleToAttribute attribute cannot be the strong name of AssemblyB. Non includere la versione, le impostazioni cultura, l'architettura o il token di chiave pubblica dell'assembly.Don't include the assembly version, culture, architecture, or public key token.

  • Se l' assembly A non è con nome sicuro, il nome dell'assembly Friend deve essere costituito solo dal nome dell'assembly.If Assembly A is not strong named, the friend assembly name should consist of only the assembly name. Per altre informazioni, vedere Procedura: Creare assembly Friend non firmati.For more information, see How to: Create unsigned friend assemblies.

  • Se AssemblyB è un nome sicuro, è necessario specificare la chiave con nome sicuro per AssemblyB usando l'impostazione del progetto o la riga di comando /keyfile opzione del compilatore.If AssemblyB is strong named, you must specify the strong-name key for AssemblyB by using the project setting or the command-line /keyfile compiler option. Per altre informazioni, vedere Procedura: Creare assembly Friend firmati.For more information, see How to: Create signed friend assemblies.

La classe StrongNameIdentityPermission consente anche la condivisione dei tipi, con le differenze seguenti:The StrongNameIdentityPermission class also provides the ability to share types, with the following differences:

  • StrongNameIdentityPermission si applica a un singolo tipo, mentre un assembly Friend si applica all'intero assembly.StrongNameIdentityPermission applies to an individual type, while a friend assembly applies to the whole assembly.

  • Se sono presenti centinaia di tipi nell' assembly a che si desidera condividere con AssemblyB, è necessario aggiungere StrongNameIdentityPermission a tutti.If there are hundreds of types in Assembly A that you want to share with AssemblyB, you have to add StrongNameIdentityPermission to all of them. Se invece si usa un assembly Friend, è sufficiente dichiarare una volta che si tratta di una relazione di tipo Friend.If you use a friend assembly, you only need to declare the friend relationship once.

  • Se si usa StrongNameIdentityPermission, i tipi da condividere devono essere dichiarati come pubblici.If you use StrongNameIdentityPermission, the types you want to share have to be declared as public. Se si usa un assembly Friend, i tipi condivisi vengono dichiarati comeC#internal () o Friend (Visual Basic).If you use a friend assembly, the shared types are declared as internal (C#) or Friend (Visual Basic).

Per informazioni su come accedere ai tipi e ai metodi diC#un assembly internal () o Friend (Visual Basic) da un file di modulo (un file con estensione netmodule ), vedere -moduleassemblynameC#() o -moduleassemblyname (Visual Basic).For information about how to access an assembly's internal (C#) or Friend (Visual Basic) types and methods from a module file (a file with the .netmodule extension), see -moduleassemblyname (C#) or -moduleassemblyname (Visual Basic).

Vedere ancheSee also