Procedura: creare assembly Friend firmati (C# e Visual Basic)

In questo esempio è indicato come utilizzare assembly Friend con assembly che hanno nomi sicuri. Entrambi gli assembly devono avere nomi sicuri. Sebbene entrambi gli assembly di questo esempio utilizzino le stesse chiavi, è possibile utilizzare chiavi differenti per i due assembly.

Per creare un assembly firmato e un assembly Friend in Visual Studio

  1. Aprire un prompt dei comandi di Visual Studio.

  2. Utilizzare la sequenza di comandi seguente con lo strumento Nome sicuro per generare un file di chiave e visualizzare la relativa chiave pubblica. Per ulteriori informazioni, vedere Sn.exe (strumento Nome sicuro).

    1. Generare una chiave con nome sicuro per questo esempio e archiviarla nel file FriendAssemblies.snk:

      sn - k FriendAssemblies.snk

    2. Estrarre la chiave pubblica da FriendAssemblies.snk e inserirla in FriendAssemblies.publickey:

      sn - p FriendAssemblies.snk FriendAssemblies.publickey

    3. Visualizzare la chiave pubblica nel file FriendAssemblies.publickey:

      sn - tp FriendAssemblies.publickey

  3. Creare in Visual Basic o C# un file denominato friend_signed_A contenente il codice seguente. Il codice utilizza l'attributo InternalsVisibleToAttribute per dichiarare friend_signed_B come assembly Friend.

    Una nuova chiave pubblica viene generata ogni volta che viene eseguito lo strumento Nome sicuro. Pertanto, è necessario sostituire la chiave pubblica nel codice seguente con la chiave pubblica appena generata, come indicato nell'esempio seguente.

    ' friend_signed_A.vb
    ' Compile with: 
    ' Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
    Imports System.Runtime.CompilerServices
    
    <Assembly: InternalsVisibleTo("friend_signed_B, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3aedce99b7e10823920206f8e46cd5558b4ec7345bd1a5b201ffe71660625dcb8f9a08687d881c8f65a0dcf042f81475d2e88f3e3e273c8311ee40f952db306c02fbfc5d8bc6ee1e924e6ec8fe8c01932e0648a0d3e5695134af3bb7fab370d3012d083fa6b83179dd3d031053f72fc1f7da8459140b0af5afc4d2804deccb6")> 
    Public Class Class1
        Public Sub Test()
            System.Console.WriteLine("Class1.Test")
            System.Console.ReadLine()
        End Sub
    End Class
    
    // friend_signed_A.cs
    // Compile with: 
    // csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
    using System.Runtime.CompilerServices;
    
    [assembly: InternalsVisibleTo("friend_signed_B, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3aedce99b7e10823920206f8e46cd5558b4ec7345bd1a5b201ffe71660625dcb8f9a08687d881c8f65a0dcf042f81475d2e88f3e3e273c8311ee40f952db306c02fbfc5d8bc6ee1e924e6ec8fe8c01932e0648a0d3e5695134af3bb7fab370d3012d083fa6b83179dd3d031053f72fc1f7da8459140b0af5afc4d2804deccb6")]
    class Class1
    {
        public void Test()
        {
            System.Console.WriteLine("Class1.Test");
            System.Console.ReadLine();
        }
    }
    
  4. Compilare e firmare friend_signed_A utilizzando il comando seguente.

    Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
    
    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
    
  5. Creare in Visual Basic o C# un file denominato friend_signed_B contenente il codice seguente. Poiché friend_signed_A specifica friend_signed_B come assembly Friend, il codice in friend_signed_B può accedere ai tipi e ai membri Friend (Visual Basic) o internal (C#) da friend_signed_A. Il file contiene il codice riportato di seguito.

    ' friend_signed_B.vb
    ' Compile with: 
    ' Vbc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll friend_signed_B.vb
    Module Sample
        Public Sub Main()
            Dim inst As New Class1
            inst.Test()
        End Sub
    End Module
    
    // friend_signed_B.cs
    // Compile with: 
    // csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
    public class Program
    {
        static void Main()
        {
            Class1 inst = new Class1();
            inst.Test();
        }
    }
    
  6. Compilare e firmare friend_signed_B utilizzando il comando seguente.

    Vbc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll friend_signed_B.vb
    
    csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
    

    Il nome dell'assembly generato dal compilatore deve corrispondere al nome dell'assembly Friend passato all'attributo InternalsVisibleToAttribute. È possibile impostare in modo esplicito l'assembly utilizzando l'opzione del compilatore /out.

    In C# è necessario specificare in modo esplicito il nome dell'assembly di output (exe o dll) tramite l'opzione del compilatore /out. L'operazione è facoltativa in Visual Basic. Per ulteriori informazioni, vedere /out (Visual Basic) e /out (opzioni del compilatore C#).

  7. Eseguire il file friend_signed_B.exe.

    Il programma stampa la stringa "Class1.Test".

Sicurezza

Ci sono somiglianze tra l'attributo InternalsVisibleToAttribute e la classe StrongNameIdentityPermission. La differenza principale è rappresentata dal fatto che StrongNameIdentityPermission può esigere autorizzazioni di sicurezza per eseguire una particolare sezione di codice, mentre l'attributo InternalsVisibleToAttribute controlla la visibilità dei membri e dei tipi Friend (Visual Basic) o internal (C#).

Vedere anche

Attività

Procedura: creare assembly Friend non firmati (C# e Visual Basic)

Riferimenti

InternalsVisibleToAttribute

/keyfile

Sn.exe (strumento Nome sicuro)

Concetti

Assembly e Global Assembly Cache (C# e Visual Basic)

Assembly Friend (C# e Visual Basic)

Creazione e utilizzo degli assembly con nome sicuro

C# Programming Guide

Altre risorse

Visual Basic Programming Guide