Dela via


Anvisningar: Skapa signerade vänsammansättningar

Det här exemplet visar hur du använder vänsammansättningar med sammansättningar som har starka namn. Båda sammansättningarna måste vara starka med namnet. Även om båda sammansättningarna i det här exemplet använder samma nycklar kan du använda olika nycklar för två sammansättningar.

Skapa en signerad sammansättning och en vänsammansättning

  1. Öppna kommandotolken.

  2. Använd följande sekvens med kommandon med verktyget Starkt namn för att generera en nyckelfil och för att visa dess offentliga nyckel. Mer information finns i Sn.exe (verktyget Starkt namn).

    1. Generera en stark namnnyckel för det här exemplet och lagra den i filen FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Extrahera den offentliga nyckeln från FriendAssemblies.snk och placera den i FriendAssemblies.publickey:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. Visa den offentliga nyckeln som lagras i filen FriendAssemblies.publickey:

      sn -tp FriendAssemblies.publickey

  3. Skapa en C#- eller Visual Basic-fil med namnet friend_signed_A som innehåller följande kod. Koden använder InternalsVisibleToAttribute attributet för att deklarera friend_signed_B som en vänsammansättning.

    Verktyget Starkt namn genererar en ny offentlig nyckel varje gång den körs. Därför måste du ersätta den offentliga nyckeln i följande kod med den offentliga nyckel som du nyss genererade, som du ser i följande exempel.

    // 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  
    
  4. Kompilera och signera friend_signed_A med hjälp av följande kommando.

    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs  
    
    Vbc -target:library -keyfile:FriendAssemblies.snk friend_signed_A.vb  
    
  5. Skapa en C#- eller Visual Basic-fil med namnet friend_signed_B som innehåller följande kod. Eftersom friend_signed_A anger friend_signed_B som en vänsammansättning kan koden i friend_signed_B komma åt internal (C#) eller Friend (Visual Basic) typer och medlemmar från friend_signed_A. Filen innehåller följande kod.

    // 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  
    
  6. Kompilera och signera friend_signed_B med hjälp av följande kommando.

    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  
    

    Namnet på den sammansättning som genereras av kompilatorn måste matcha namnet på vänsammansättningen som skickas InternalsVisibleToAttribute till attributet. Du måste uttryckligen ange namnet på utdatasammansättningen (.exe eller .dll) med hjälp av kompilatoralternativet -out . Mer information finns i OutputAssembly (C#-kompilatoralternativ) eller -out (Visual Basic).

  7. Kör filen friend_signed_B.exe .

    Programmet matar ut strängen Class1.Test.

.NET-säkerhet

Det finns likheter mellan attributet InternalsVisibleToAttribute och StrongNameIdentityPermission klassen. Den största skillnaden är att StrongNameIdentityPermission kan kräva säkerhetsbehörigheter för att köra ett visst kodavsnitt, medan InternalsVisibleToAttribute attributet styr synligheten för internal (C#) eller Friend (Visual Basic) typer och medlemmar.

Se även