Delen via


Procedure: Ondertekende vriendenassembly's maken

In dit voorbeeld ziet u hoe u vriendassembly's gebruikt met assembly's met sterke namen. Beide assembly's moeten een sterke naam hebben. Hoewel beide assembly's in dit voorbeeld dezelfde sleutels gebruiken, kunt u verschillende sleutels voor twee assembly's gebruiken.

Een ondertekende assembly en een vriendassembly maken

  1. Open een opdrachtprompt.

  2. Gebruik de volgende reeks opdrachten met het hulpprogramma Strong Name om een sleutelbestand te genereren en de openbare sleutel weer te geven. Zie Sn.exe (hulpprogramma Sterke naam) voor meer informatie.

    1. Genereer een sterke-naamsleutel voor dit voorbeeld en sla deze op in het bestand FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Pak de openbare sleutel uit FriendAssemblies.snk en plaats deze in FriendAssemblies.publickey:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. De openbare sleutel weergeven die is opgeslagen in het bestand FriendAssemblies.publickey:

      sn -tp FriendAssemblies.publickey

  3. Maak een C# of Visual Basic-bestand met de naam friend_signed_A met de volgende code. De code gebruikt het InternalsVisibleToAttribute kenmerk om friend_signed_B als een vriendassembly te declareren.

    Het hulpprogramma Strong Name genereert elke keer dat deze wordt uitgevoerd een nieuwe openbare sleutel. Daarom moet u de openbare sleutel in de volgende code vervangen door de openbare sleutel die u zojuist hebt gegenereerd, zoals wordt weergegeven in het volgende voorbeeld.

    // 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. Compileer en onderteken friend_signed_A met behulp van de volgende opdracht.

    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs  
    
    Vbc -target:library -keyfile:FriendAssemblies.snk friend_signed_A.vb  
    
  5. Maak een C# of Visual Basic-bestand met de naam friend_signed_B die de volgende code bevat. Omdat friend_signed_A friend_signed_B opgeeft als een vriendassembly, heeft de code in friend_signed_B toegang tot internal (C#) of (Visual Basic) en Friend leden van friend_signed_A. Het bestand bevat de volgende code.

    // 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. Compileer en onderteken friend_signed_B met behulp van de volgende opdracht.

    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  
    

    De naam van de assembly die door de compiler wordt gegenereerd, moet overeenkomen met de naam van de vriendassembly die is doorgegeven aan het InternalsVisibleToAttribute kenmerk. U moet expliciet de naam van de uitvoerassembly (.exe of .dll) opgeven met behulp van de -out compileroptie. Zie OutputAssembly (C#-compileropties) of -out (Visual Basic) voor meer informatie.

  7. Voer het friend_signed_B.exe-bestand uit.

    Het programma voert de tekenreeks Class1.Test uit.

.NET-beveiliging

Er zijn overeenkomsten tussen het InternalsVisibleToAttribute kenmerk en de StrongNameIdentityPermission klasse. Het belangrijkste verschil is dat StrongNameIdentityPermission u beveiligingsmachtigingen kunt vragen om een bepaalde codesectie uit te voeren, terwijl het InternalsVisibleToAttribute kenmerk de zichtbaarheid van internal (C#) of Friend (Visual Basic)-typen en -leden bepaalt.

Zie ook