Como criar assemblies amigáveis assinados

Este exemplo mostra como usar assemblies amigáveis com assemblies que têm nomes fortes. Os dois assemblies devem ter nomes fortes. Embora os dois assemblies neste exemplo usem as mesmas chaves, você pode usar chaves diferentes para dois assemblies.

Criar um assembly assinado e um assembly amigável

  1. Abra um prompt de comando.

  2. Use a seguinte sequência de comandos com a ferramenta Nome Forte para gerar um keyfile e exibir sua chave pública. Para saber mais, confira Sn.exe (ferramenta de nome forte).

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

      sn -k FriendAssemblies.snk

    2. Extraia a chave pública de FriendAssemblies.snk e a coloque 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 contendo o código a seguir. O código usa o atributo InternalsVisibleToAttribute para declarar friend_signed_B como um assembly amigável.

    A ferramenta Nome Forte gera uma nova chave pública sempre que for executada. Portanto, você deve substituir a chave pública no código a seguir com a 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 comando a seguir.

    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 contendo o código a seguir. Como friend_signed_A especifica friend_signed_B como um assembly amigável, o código em friend_signed_B pode acessar tipos e membros internal (C#) ou Friend (Visual Basic) de friend_signed_A. O arquivo contém o seguinte código.

    // 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 comando a seguir.

    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 amigável passado para o atributo InternalsVisibleToAttribute. Especifique explicitamente o nome do assembly de saída (.exe ou .dll) usando a opção do compilador -out. Para saber mais, confira OutputAssembly (opções do compilador C#) ou -out (Visual Basic).

  7. Execute o arquivo friend_signed_B.exe.

    O programa gera como saída a cadeia de caracteres Class1.Test.

Segurança do .NET

Há semelhanças entre o atributo InternalsVisibleToAttribute e a classe StrongNameIdentityPermission. A principal diferença é que StrongNameIdentityPermission pode solicitar permissões de segurança para executar determinada seção de código, enquanto o atributo InternalsVisibleToAttribute controla a visibilidade de membros e tipos internal (C#) ou Friend (Visual Basic).

Confira também