Comment : créer des assemblys friend signés (C# et Visual Basic)
Cet exemple indique comment utiliser des assemblys friend avec les assemblys qui ont des noms forts. Les deux types d'assemblys doivent avoir des noms forts. Bien que les deux types d'assemblys de cet exemple utilisent les mêmes clés, vous pourriez utiliser des clés différentes pour les deux types d'assemblys.
Pour créer un assembly signé et un assembly friend dans Visual Studio
Ouvrez une invite de commandes Visual Studio.
Utilisez la séquence de commandes suivante avec l'outil Strong Name Tool pour générer un keyfile 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 Visual Basic ou C# nommé friend_signed_A qui contient le code suivant. Le code utilise l'attribut InternalsVisibleToAttribute pour déclarer friend_signed_B en tant qu'assembly friend.
L'outil Strong Name Tool génère une nouvelle clé publique chaque fois qu'il s'exécute. Par conséquent, vous devez remplacer la clé publique dans le code suivant par la clé publique que vous venez de générer, comme indiqué dans l'exemple ci-dessous.
' 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(); } }
Compilez et signez friend_signed_A à l'aide de la commande suivante.
Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Créez un fichier Visual Basic ou C# nommé friend_signed_B qui contient le code suivant. Étant donné que friend_signed_A spécifie friend_signed_B comme assembly friend, le code de friend_signed_B peut accéder aux types et membres Friend (Visual Basic) ou internal (C#) à partir de friend_signed_A. Le fichier contient le code suivant.
' 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(); } }
Compilez et signez friend_signed_B à l'aide de la commande suivante.
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
Le nom de l'assembly généré par le compilateur doit correspondre au nom d'assembly friend passé à l'attribut InternalsVisibleToAttribute. Vous pouvez définir explicitement l'assembly en utilisant l'option du compilateur /out.
En C#, vous devez spécifier explicitement le nom de l'assembly de sortie (.exe ou .dll) à l'aide de l'option de compilateur /out. En Visual Basic, cette opération est facultative. Pour plus d'informations, consultez /out (Visual Basic) et /out (Options du compilateur C#).
Exécutez le fichier friend_signed_B.exe.
Le programme imprime la chaîne « Class1.Test ».
Sécurité
Il existe des ressemblances entre l'attribut InternalsVisibleToAttribute et la classe StrongNameIdentityPermission. La principale différence réside dans le fait que StrongNameIdentityPermission peut demander des autorisations de sécurité pour exécuter une section particulière de code, alors que l'attribut InternalsVisibleToAttribute contrôle la visibilité des types et membres Friend (Visual Basic) ou internal (C#).
Voir aussi
Tâches
Comment : créer des assemblys friend non signés (C# et Visual Basic)
Référence
Sn.exe (outil Strong Name Tool)
Concepts
Assemblys et le Global Assembly Cache (C# et Visual Basic)
Assemblys friend (C# et Visual Basic)