Compartilhar via


Como criar assemblies amigáveis assinados (C# e Visual Basic)

Este exemplo mostra como usar friend assemblies com módulos (assemblies) 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 um assembly do amigo no Visual Studio

  1. Abra um prompt de comando Visual Studio.

  2. 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).

    1. Gerar uma chave de nome de alta segurança para este exemplo e armazená-lo no arquivo FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Extrair a chave pública de FriendAssemblies.snk e colocá-lo em FriendAssemblies.publickey:

      FriendAssemblies.publickey de FriendAssemblies.snk -p sn

    3. Exiba a chave pública armazenada no arquivo FriendAssemblies.publickey:

      sn - tp FriendAssemblies.publickey

  3. 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 para declarar o friend_signed_B como um assembly de amigo.

    A ferramenta Strong Name gera uma nova chave pública, sempre que ele é executado. Portanto, você deve substituir a chave pública no código a seguir com a chave pública que você acabou de ser gerada, como 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();
        }
    }
    
  4. 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
    
  5. Crie um arquivo de Visual Basic ou C# chamado 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();
        }
    }
    
  6. 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ções do compilador C#).

  7. 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, ao passo que o InternalsVisibleToAttribute atributo controla a visibilidade de Friend (Visual Basic) ou internal (C#) de tipos e membros.

Consulte também

Tarefas

Como criar assemblies amigáveis não assinados (C# e Visual Basic)

Referência

InternalsVisibleToAttribute

/keyfile

Sn.exe (Ferramenta de Nome Forte)

Conceitos

Assemblies e o cache de assemblies global (C# e Visual Basic)

Assemblies amigáveis (C# e Visual Basic)

Guia de Programação em C#

Outros recursos

Criando e usando assemblies de nomes fortes

Guia de programação do Visual Basic