Compartir a través de


Cómo: Crear ensamblados de confianza firmados (C# y Visual Basic)

En este ejemplo se muestra cómo usar los ensamblados de confianza con ensamblados que tienen nombres seguros. Ambos ensamblados deben tener nombres seguros. Aunque los dos ensamblados de este ejemplo utilizan las mismas claves, se pueden usar claves diferentes para dos ensamblados.

Para crear un ensamblado firmado y un ensamblado de confianza en Visual Studio

  1. Abra un símbolo del sistema de Visual Studio.

  2. Utilice la secuencia de comandos siguiente con la herramienta de nombre seguro para generar un archivo de claves y mostrar su clave pública. Para obtener más información, vea Sn.exe (Herramienta de nombre seguro).

    1. Genere una clave de nombre seguro para este ejemplo y almacénela en el archivo FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Extraiga la clave pública de FriendAssemblies.snk y colóquela en FriendAssemblies.publickey:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. Muestre la clave pública almacenada en el archivo FriendAssemblies.publickey:

      sn -tp FriendAssemblies.publickey

  3. Cree un archivo de Visual Basic o C# denominado friend_signed_A que contenga el siguiente código. El código utiliza el atributo InternalsVisibleToAttribute para declarar friend_signed_B como ensamblado de confianza.

    La herramienta de nombre seguro genera una nueva clave pública cada vez que se ejecuta. Por consiguiente, debe reemplazar la clave pública del código siguiente por la clave pública que acaba de generar, como se muestra en el ejemplo siguiente.

    ' 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 y firme friend_signed_A mediante el siguiente comando.

    Vbc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.vb
    
    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs
    
  5. Cree un archivo de Visual Basic o C# denominado friend_signed_B que contenga el siguiente código. Dado que friend_signed_A especifica que friend_signed_B es un ensamblado de confianza, el código de friend_signed_B puede obtener acceso a los tipos y miembros de Friend (Visual Basic) o internal (C#) de friend_signed_A. El archivo contiene el siguiente código.

    ' 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 y firme friend_signed_B mediante el siguiente comando.

    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
    

    El nombre del ensamblado generado por el compilador debe coincidir con el nombre del ensamblado de confianza pasado al atributo InternalsVisibleToAttribute. Puede establecer explícitamente el ensamblado utilizando la opción del compilador /out.

    En C#, debe especificar explícitamente el nombre del ensamblado de salida (.exe o .dll) mediante la opción del compilador /out. En Visual Basic, esto es opcional. Para obtener más información, vea /out (Visual Basic) y /out (Opciones del compilador de C#).

  7. Ejecute el archivo friend_signed_B.exe.

    El programa imprime la cadena "Class1.Test".

Seguridad

Hay similitudes entre el atributo InternalsVisibleToAttribute y la clase StrongNameIdentityPermission. La principal diferencia reside en que StrongNameIdentityPermission puede exigir permisos de seguridad para ejecutar una sección de código concreta, mientras que el atributo InternalsVisibleToAttribute controla la visibilidad de los tipos y miembros de Friend (Visual Basic) o internal (C#).

Vea también

Tareas

Cómo: Crear ensamblados de confianza sin firmar (C# y Visual Basic)

Referencia

InternalsVisibleToAttribute

/keyfile

Sn.exe (Herramienta de nombre seguro)

Conceptos

Ensamblados y caché global de ensamblados (C# y Visual Basic)

Ensamblados de confianza (C# y Visual Basic)

Guía de programación de C#

Otros recursos

Crear y utilizar ensamblados con nombre seguro

Guía de programación en Visual Basic