Comment : créer des assemblys Friend signés
Cet exemple montre comment utiliser des assemblys friend avec des assemblys ayant des noms forts. Les deux assemblys doivent avoir des noms forts. Bien que les deux assemblys dans cet exemple utilisent les mêmes clés, vous pouvez utiliser des clés différentes pour deux assemblys.
Créer un assembly signé et un assembly friend
Ouvrez une invite de commandes.
Utilisez la séquence de commandes suivante avec l’outil Strong Name Tool pour générer un fichier de clé et afficher sa clé publique. Pour plus d’informations, consultez Sn.exe (outil Strong Name Tool).
Générez une clé de nom fort pour cet exemple et stockez-la dans le fichier FriendAssemblies.snk :
sn -k FriendAssemblies.snk
Extrayez la clé publique de FriendAssemblies.snk et mettez-la dans FriendAssemblies.publickey :
sn -p FriendAssemblies.snk FriendAssemblies.publickey
Affichez la clé publique stockée dans le fichier FriendAssemblies.publickey :
sn -tp FriendAssemblies.publickey
Créez un fichier C# ou Visual Basic nommé friend_signed_A qui contient le code suivant. Le code utilise l’attribut InternalsVisibleToAttribute pour déclarer friend_signed_B comme assembly friend.
L’outil Strong Name Tool génère une nouvelle clé publique chaque fois qu’il s’exécute. Vous devez donc remplacer la clé publique dans le code suivant par la clé publique que vous venez de générer, comme illustré dans l’exemple suivant.
// 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
Compilez et signez friend_signed_A à l’aide de la commande suivante.
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Vbc -target:library -keyfile:FriendAssemblies.snk friend_signed_A.vb
Créez un fichier C# ou Visual Basic nommé friend_signed_B qui contient le code suivant. Étant donné que friend_signed_A spécifie friend_signed_Bcomme assembly friend, le code dans friend_signed_B peut accéder aux membres et aux types
internal
(C#) ouFriend
(Visual Basic) de friend_signed_A. Le fichier contient le code suivant.// 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
Compilez et signez friend_signed_B à l’aide de la commande suivante.
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
Le nom de l’assembly généré par le compilateur doit correspondre au nom de l’assembly friend passé à l’attribut InternalsVisibleToAttribute. Vous devez spécifier explicitement le nom de l’assembly de sortie (.exe ou .dll) à l’aide de l’option du compilateur
-out
. Pour plus d’informations, consultez OutputAssembly (options du compilateur C#) ou -out (Visual Basic).Exécutez le fichier friend_signed_B.exe.
Le programme génère la chaîne Class1.Test.
Sécurité .NET
Il existe des similitudes entre l’attribut InternalsVisibleToAttribute et la classe StrongNameIdentityPermission. La principale différence est que StrongNameIdentityPermission peut demander des autorisations de sécurité pour exécuter une section de code particulière, tandis que l’attribut InternalsVisibleToAttribute contrôle la visibilité des membres et des types internal
(C#) ou Friend
(Visual Basic).