Gewusst wie: Erstellen von signierten Friend-Assemblys (C# und Visual Basic)
In diesem Beispiel wird veranschaulicht, wie Friend-Assemblys mit Assemblys verwendet werden, die über starke Namen verfügen. Beide Assemblys müssen über einen starken Namen verfügen. Obwohl in diesem Beispiel von beiden Assemblys die gleichen Schlüssel verwendet wird, können für zwei Assemblys verschiedene Schlüssel verwendet werden.
So erstellen Sie eine signierte Assembly und eine Friend-Assembly in Visual Studio
Öffnen Sie die Visual Studio-Eingabeaufforderung.
Verwenden Sie die folgenden Befehle, um mit dem Strong Name-Tool eine Schlüsseldatei zu erstellen und deren öffentlichen Schlüssel anzeigen. Weitere Informationen finden Sie unter Sn.exe (Strong Name-Tool).
Erstellen Sie für dieses Beispiel einen Schlüssel mit starkem Namen, und speichern Sie diesen in der Datei FriendAssemblies.snk:
sn -k FriendAssemblies.snk
Extrahieren Sie den öffentlichen Schlüssel aus FriendAssemblies.snk, und fügen Sie ihn in FriendAssemblies.publickey ein:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
Zeigen Sie den in der Datei FriendAssemblies.publickey gespeicherten öffentlichen Schlüssel an:
sn -tp FriendAssemblies.publickey
Erstellen Sie in Visual Basic oder C# eine Datei mit dem Namen friend_signed_A, die den folgenden Code enthält. Im Code wird friend_signed_B mit dem InternalsVisibleToAttribute-Attribut als Friend-Assembly deklariert.
Bei jeder Ausführung des Strong Name-Tools wird ein neuer öffentlicher Schlüssel erstellt. Daher müssen Sie den öffentlichen Schlüssel im folgenden Code durch den neu erstellten öffentlichen Schlüssel ersetzen, wie im folgenden Beispiel dargestellt.
' 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(); } }
Kompilieren und signieren Sie friend_signed_A mit dem folgenden Befehl.
Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Erstellen Sie in Visual Basic oder C# eine Datei mit dem Namen friend_signed_B, die den folgenden Code enthält. Da friend_signed_B im Code von friend_signed_A als Friend-Assembly angegeben wird, kann der Code in friend_signed_B auf die als Friend (Visual Basic) bzw. als internal (C#) gekennzeichneten Typen und Member zugreifen. Die Datei enthält den folgenden Code.
' 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(); } }
Kompilieren und signieren Sie friend_signed_B mit dem folgenden Befehl.
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
Der Name der vom Compiler erstellten Assembly muss mit dem Namen der Friend-Assembly übereinstimmen, der an das InternalsVisibleToAttribute-Attribut übergeben wurde. Sie können die Assembly mithilfe der /out-Compileroption explizit festlegen.
In C# müssen Sie den Namen der Ausgabeassembly mit der /out-Compileroption explizit angeben (EXE- oder DLL-Datei). In Visual Basic ist dies optional. Weitere Informationen finden Sie unter /out (Visual Basic) und unter /out (C#-Compileroptionen).
Führen Sie die Datei friend_signed_B.exe aus.
Das Programm druckt die Zeichenfolge "Class1.Test".
Sicherheit
Das InternalsVisibleToAttribute-Attribut ist mit der StrongNameIdentityPermission-Klasse vergleichbar. Der Hauptunterschied liegt darin, dass von der StrongNameIdentityPermission-Klasse Sicherheitsberechtigungen für die Ausführung einzelner Codeabschnitte angefordert werden können, während das InternalsVisibleToAttribute-Attribut die Sichtbarkeit der als Friend (Visual Basic) bzw. als internal (C#) gekennzeichneten Typen und Member steuert.
Siehe auch
Aufgaben
Gewusst wie: Erstellen von nicht signierten Friend-Assemblys (C# und Visual Basic)
Referenz
Assemblys und der globale Assemblycache (C# und Visual Basic)
Friend-Assemblys (C# und Visual Basic)
Konzepte
Erstellen und Verwenden von Assemblys mit starkem Namen