Partilhar via


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

  1. Abra uma linha de comandos.

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

    1. Gere uma chave de nome forte para este exemplo e armazene-a no arquivo FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Extraia a chave pública de FriendAssemblies.snk e coloque-a em FriendAssemblies.publickey:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

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

      sn -tp FriendAssemblies.publickey

  3. 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  
    
  4. 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  
    
  5. 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#) ou Friend (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  
    
  6. 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).

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

Consulte também