Como: Criar assinado Friend Assemblies (C# e Visual Basic)
Este exemplo mostra como usar o friend assemblies com conjuntos de módulos com nomes fortes. Os dois assemblies devem ser nome forte. Embora os dois assemblies neste exemplo usam as mesmas teclas, você poderia usar chaves diferentes para os dois assemblies.
Para criar um assembly assinado e o assembly de um amigo em Visual Studio
Abra um prompt de comando Visual Studio.
Use a seguinte seqüência de comandos com a ferramenta Strong Name para gerar um arquivo de chaves e para exibir a sua chave pública. Para obter mais informações, consulte Sn. exe (ferramenta de nome forte).
Gerar uma chave de nome de alta segurança para este exemplo e armazená-lo no arquivo FriendAssemblies.snk:
sn -k FriendAssemblies.snk
Extrair a chave pública de FriendAssemblies.snk e colocá-lo em FriendAssemblies.publickey:
FriendAssemblies.publickey de FriendAssemblies.snk -p sn
Exiba a chave pública armazenada no arquivo FriendAssemblies.publickey:
sn - tp FriendAssemblies.publickey
Crie um arquivo de Visual Basic ou C# chamado friend_signed_A que contém o código a seguir. O código usa a InternalsVisibleToAttribute atributo declarar friend_signed_B como um assembly do amigo.
A ferramenta Strong Name gera uma nova chave pública toda vez que ele é executado. Portanto, você deve substituir a chave pública no código a seguir com a chave pública que você gerou apenas, conforme mostrado no exemplo a seguir.
' 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(); } }
Compile e assinar friend_signed_A usando o comando a seguir.
Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
Criar um arquivo de Visual Basic ou C# que é denominado friend_signed_B e contém o código a seguir. Como friend_signed_A Especifica o friend_signed_B como um assembly de amigo, o código de friend_signed_B pode acessar Friend (Visual Basic) ou internal (C#) de tipos e membros da friend_signed_A. O arquivo contém o código a seguir.
' 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(); } }
Compile e assinar friend_signed_B usando o comando a seguir.
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
O nome do assembly gerado pelo compilador deve corresponder ao nome de assembly friend passado para o InternalsVisibleToAttribute atributo. Você pode definir explicitamente o assembly usando o /out opção de compilador.
No C#, você deve especificar explicitamente o nome do assembly de saída (. exe ou. dll), usando o /out opção de compilador. Visual Basic, isso é opcional. Para obter mais informações, consulte /out (Visual Basic) e /out ( Opçõesdo compilador TRANSLATION FROM VPE FOR CSHARP).
Execute o arquivo friend_signed_B.exe.
O programa imprime a seqüência de caracteres "Class1.Test".
Segurança
Há semelhanças entre o atributo InternalsVisibleToAttribute e a classe StrongNameIdentityPermission. A principal diferença é que StrongNameIdentityPermission pode exigir permissões de segurança para executar uma determinada seção de código, enquanto o InternalsVisibleToAttribute atributo controla a visibilidade de Friend (Visual Basic) ou internal (C#) os tipos e membros.
Consulte também
Tarefas
Como: Criar Unsigned Friend Assemblies (C# e Visual Basic)
Referência
Sn. exe (ferramenta de nome forte)
Conceitos
Assemblies e o Cache de Assembly Global (C# e Visual Basic)
Friend Assemblies (C# e Visual Basic)
Criando e usando Assemblies de Nome Forte