Procedura: Creare assembly Friend firmati
In questo esempio viene illustrato come usare assembly Friend e assembly con nomi sicuri. È necessario che entrambi i tipi di assembly abbiano un nome sicuro. Gli assembly in questo esempio usano le stesse chiavi. È comunque possibile usare chiavi diverse per i due assembly.
Creare un assembly firmato e un assembly Friend
Apri un prompt dei comandi.
Eseguire la sequenza di comandi seguente con lo strumento Nome sicuro per generare un keyfile e per visualizzare la relativa chiave pubblica. Per altre informazioni, vedere Sn.exe (strumento Nome sicuro).
Generare una chiave con nome sicuro per questo esempio e archiviarla nel file FriendAssemblies.snk:
sn -k FriendAssemblies.snk
Estrarre la chiave pubblica da FriendAssemblies.snk e inserirla in FriendAssemblies.publickey:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
Visualizzare la chiave pubblica archiviata nel file FriendAssemblies.publickey:
sn -tp FriendAssemblies.publickey
Creare un file C# o Visual Basic denominato friend_signed_A contenente il codice seguente. Il codice usa l'attributo InternalsVisibleToAttribute per dichiarare friend_signed_B come assembly Friend.
Ogni volta che viene eseguito, lo strumento Nome sicuro genera una chiave pubblica nuova. È pertanto necessario sostituire la chiave pubblica nel codice seguente con la chiave pubblica appena generata, come illustrato nell'esempio seguente.
// 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(); } }
' 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
Compilare e firmare friend_signed_A usando il comando seguente.
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Vbc -target:library -keyfile:FriendAssemblies.snk friend_signed_A.vb
Creare un file C# o Visual Basic 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 a
internal
tipi e membri (C#) oFriend
(Visual Basic) da friend_signed_A. Il file contiene il codice seguente.// 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(); } }
' 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
Compilare e firmare friend_signed_B usando il comando seguente.
csc /keyfile:FriendAssemblies.snk /r:friend_signed_A.dll /out:friend_signed_B.exe friend_signed_B.cs
vbc -keyfile:FriendAssemblies.snk -r:friend_signed_A.dll friend_signed_B.vb
Il nome dell'assembly generato dal compilatore deve corrispondere al nome dell'assembly Friend passato all'attributo InternalsVisibleToAttribute. È necessario specificare in modo esplicito il nome dell'assembly di output (.exe o .dll) usando l'opzione del
-out
compilatore. Per altre informazioni, vedere OutputAssembly (opzioni del compilatore C#) o -out (Visual Basic).For more information, see OutputAssembly (C# compiler options) or -out (Visual Basic).Eseguire il file friend_signed_B.exe .
Il programma restituisce la stringa Class1.Test.
Protezione .NET
Ci sono alcune analogie tra l'attributo InternalsVisibleToAttribute e la classe StrongNameIdentityPermission. La differenza principale è che StrongNameIdentityPermission può richiedere autorizzazioni di sicurezza per eseguire una sezione specifica di codice, mentre l'attributo InternalsVisibleToAttribute controlla la visibilità di internal
tipi e membri (C#) o Friend
(Visual Basic).