Como: Criar assemblies de amigos assinados
Este exemplo mostra como usar assemblies amigos com assemblies que têm nomes fortes. Ambos os conjuntos devem ter um nome forte. Embora ambos os assemblies neste exemplo usem as mesmas chaves, você pode usar chaves diferentes para dois assemblies.
Criar um assembly assinado e um assembly amigo
Abra uma linha de comandos.
Use a seguinte sequência de comandos com a ferramenta Nome forte para gerar um arquivo de chave e exibir sua chave pública. Para obter mais informações, consulte Sn.exe (ferramenta Nome forte).
Gere uma chave de nome forte para este exemplo e armazene-a no arquivo FriendAssemblies.snk:
sn -k FriendAssemblies.snk
Extraia a chave pública de FriendAssemblies.snk e coloque-a em FriendAssemblies.publickey:
sn -p FriendAssemblies.snk FriendAssemblies.publickey
Exiba a chave pública armazenada no arquivo FriendAssemblies.publickey:
sn -tp FriendAssemblies.publickey
Crie um arquivo C# ou Visual Basic chamado friend_signed_A que contém o código a seguir. O código usa o InternalsVisibleToAttribute atributo para declarar friend_signed_B como um assembly amigo.
A ferramenta Nome forte gera uma nova chave pública sempre que é executada. Portanto, você deve substituir a chave pública no código a seguir pela chave pública que você acabou de gerar, conforme mostrado no exemplo a seguir.
// 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
Compile e assine friend_signed_A usando o seguinte comando.
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Vbc -target:library -keyfile:FriendAssemblies.snk friend_signed_A.vb
Crie um arquivo C# ou Visual Basic chamado friend_signed_B que contém o código a seguir. Como friend_signed_A especifica friend_signed_B como um assembly amigo, o código no friend_signed_B pode acessar
internal
tipos (C#) ouFriend
(Visual Basic) e membros de friend_signed_A. O arquivo contém o código a seguir.// 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
Compile e assine friend_signed_B usando o seguinte comando.
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
O nome do assembly gerado pelo compilador deve corresponder ao nome do assembly amigo passado para o InternalsVisibleToAttribute atributo. Você deve especificar explicitamente o nome do assembly de saída (.exe ou .dll) usando a
-out
opção do compilador. Para obter mais informações, consulte OutputAssembly (opções do compilador C#) ou -out (Visual Basic).Execute o arquivo friend_signed_B.exe .
O programa produz a string Class1.Test.
Segurança do .NET
Há semelhanças entre o InternalsVisibleToAttribute atributo e a StrongNameIdentityPermission classe. A principal diferença é que StrongNameIdentityPermission pode exigir permissões de segurança para executar uma seção específica de código, enquanto o InternalsVisibleToAttribute atributo controla a visibilidade de tipos e membros ( internal
C#) ou Friend
(Visual Basic).