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
Öppna kommandotolken.
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).
Generera en stark namnnyckel för det här exemplet och lagra den i filen FriendAssemblies.snk:
sn -k FriendAssemblies.snk
Extrahera den offentliga nyckeln från FriendAssemblies.snk och placera den i FriendAssemblies.publickey:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
Visa den offentliga nyckeln som lagras i filen FriendAssemblies.publickey:
sn -tp FriendAssemblies.publickey
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
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
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#) ellerFriend
(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
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).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
- InternalsVisibleToAttribute
- Sammansättningar i .NET
- Vänsammansättningar
- Anvisningar: Skapa osignerade vänsammansättningar
- KeyFile (C#)
- -keyfile (Visual Basic)
- Sn.exe (verktyget Starkt namn)
- Skapa och använda starka namngivna sammansättningar
- Programmeringsguide för C#
- Programmeringsbegrepp (Visual Basic)