Vorgehensweise: Erstellen von signierten Friend-Assemblys (C#)How to: Create Signed Friend Assemblies (C#)

Dieses Beispiel zeigt, wie Sie Friend-Assemblys mit Assemblys mit starken Namen verwenden.This example shows how to use friend assemblies with assemblies that have strong names. Beide Assemblys müssen starke Namen erhalten.Both assemblies must be strong named. Obwohl beide Assemblys in diesem Beispiel die gleichen Schlüssel verwenden, können Sie unterschiedliche Schlüssel für zwei Assemblys verwenden.Although both assemblies in this example use the same keys, you could use different keys for two assemblies.

So erstellen Sie eine signierte Assembly und eine Friend-AssemblyTo create a signed assembly and a friend assembly

  1. Öffnen Sie eine Eingabeaufforderung.Open a command prompt.

  2. Verwenden Sie die folgende Sequenz von Befehlen mit dem Strong Name-Tool, um eine Schlüsseldatei zu generieren und den öffentlichen Schlüssel anzuzeigen.Use the following sequence of commands with the Strong Name tool to generate a keyfile and to display its public key. Weitere Informationen finden Sie unter Sn.exe (Strong Name-Tool).For more information, see Sn.exe (Strong Name Tool).

    1. Generieren Sie einen Schlüssel mit starkem Namen für dieses Beispiel, und speichern Sie ihn in der Datei „FriendAssemblies.snk“:Generate a strong-name key for this example and store it in the file FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Extrahieren Sie den öffentlichen Schlüssel aus FriendAssemblies.snk, und fügen Sie es in FriendAssemblies.publickey ein:Extract the public key from FriendAssemblies.snk and put it into FriendAssemblies.publickey:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. Zeigen Sie den öffentlichen Schlüssel, der in der Datei „FriendAssemblies.publickey“ gespeichert ist:Display the public key stored in the file FriendAssemblies.publickey:

      sn -tp FriendAssemblies.publickey

  3. Erstellen Sie eine C#-Datei namens friend_signed_A mit dem folgenden Code.Create a C# file named friend_signed_A that contains the following code. Der Code verwendet das Attribut InternalsVisibleToAttribute, um „friend_signed_B“ als Friend-Assembly zu deklarieren.The code uses the InternalsVisibleToAttribute attribute to declare friend_signed_B as a friend assembly.

    Das Strong Name-Tool generiert jedes Mal einen neuen öffentlichen Schlüssel, wenn es ausgeführt wird.The Strong Name tool generates a new public key every time it runs. Aus diesem Grund müssen Sie den öffentlichen Schlüssel im folgenden Code durch den öffentlichen Schlüssel ersetzen, den Sie gerade erstellt haben, so wie im folgenden Beispiel gezeigt.Therefore, you must replace the public key in the following code with the public key you just generated, as shown in the following example.

    // 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. Kompilieren und signieren Sie friend_signed_A mithilfe des folgenden Befehls.Compile and sign friend_signed_A by using the following command.

    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs  
    
  5. Erstellen Sie eine C#-Datei mit dem Namen friend_signed_B, die den folgenden Code enthält.Create a C# file that is named friend_signed_B and contains the following code. Da friend_signed_A friend_signed_B als Friend-Assembly angibt, kann der Code in friend_signed_B auf internal-Typen und -Member aus friend_signed_A zugreifen.Because friend_signed_A specifies friend_signed_B as a friend assembly, the code in friend_signed_B can access internal types and members from friend_signed_A. Im Folgenden wird der Code dieser Datei dargestellt:The file contains the following code.

    // 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. Kompilieren und signieren Sie friend_signed_B, indem Sie den folgenden Befehl verwenden.Compile and sign friend_signed_B by using the following command.

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

    Der Name der vom Compiler generierten Assembly muss mit dem Namen der Friend-Assembly übereinstimmen, die an das Attribut InternalsVisibleToAttribute übergeben wird.The name of the assembly generated by the compiler must match the friend assembly name passed to the InternalsVisibleToAttribute attribute. Sie müssen den Namen der Ausgabeassembly (EXE oder DLL) explizit mit der /out-Compileroption angeben.You must explicitly specify the name of the output assembly (.exe or .dll) by using the /out compiler option. Weitere Informationen finden Sie unter /out (C# Compiler Options).For more information, see /out (C# Compiler Options).

  7. Führen Sie die Datei „friend_signed_B.exe“ aus.Run the friend_signed_B.exe file.

    Das Programm gibt die Zeichenfolge „Class1.Test“ aus.The program prints the string "Class1.Test".

.NET Framework-Sicherheit.NET Framework Security

Es gibt Ähnlichkeiten zwischen dem Attribut InternalsVisibleToAttribute und der Klasse StrongNameIdentityPermission.There are similarities between the InternalsVisibleToAttribute attribute and the StrongNameIdentityPermission class. Der Hauptunterschied besteht darin, dass StrongNameIdentityPermission Sicherheitsberechtigungen verlangen kann, um einen bestimmten Codeabschnitt auszuführen, während das Attribut InternalsVisibleToAttribute die Sichtbarkeit der internal-Typen und -Member steuert.The main difference is that StrongNameIdentityPermission can demand security permissions to run a particular section of code, whereas the InternalsVisibleToAttribute attribute controls the visibility of internal types and members.

Siehe auchSee Also

InternalsVisibleToAttribute
Assemblies and the Global Assembly Cache (C#) (Assemblys und der globale Assemblycache (C#))Assemblies and the Global Assembly Cache (C#)
Friend-Assemblys (C#)Friend Assemblies (C#)
How to: Create Unsigned Friend Assemblies (C#) (Vorgehensweise: Erstellen von nicht signierten Friend-Assemblys (C#))How to: Create Unsigned Friend Assemblies (C#)
/keyfile/keyfile
Sn.exe (Strong Name-Tool)Sn.exe (Strong Name Tool)
Erstellen und Verwenden von Assemblys mit starkem NamenCreating and Using Strong-Named Assemblies
C#-ProgrammierhandbuchC# Programming Guide