Bagikan melalui


Cara: Membuat rakitan teman yang ditandatangani

Contoh ini menunjukkan bagaimana cara menggunakan rakitan teman dengan rakitan yang memiliki nama yang kuat. Kedua rakitan harus memiliki nama yang kuat. Meskipun kedua rakitan dalam contoh ini menggunakan kunci yang sama, Anda dapat menggunakan kunci yang berbeda untuk dua rakitan.

Membuat rakitan yang ditandatangani dan rakitan teman

  1. Buka prompt perintah.

  2. Gunakan urutan perintah berikut menggunakan alat dengan Nama yang Kuat untuk menghasilkan keyfile serta menampilkan kunci umumnya. Untuk informasi selengkapnya, lihat Sn.exe (Alat dengan Nama yang Kuat).

    1. Buat nama kunci yang kuat untuk contoh ini dan simpan dalam file FriendAssemblies.snk:

      sn -k FriendAssemblies.snk

    2. Ekstrak kunci umum dari FriendAssemblies.snk dan masukkan ke dalam FriendAssemblies.publickey:

      sn -p FriendAssemblies.snk FriendAssemblies.publickey

    3. Tampilkan kunci umum yang tersimpan dalam file FriendAssemblies.publickey:

      sn -tp FriendAssemblies.publickey

  3. Buat file C# atau Visual Basic bernama friend_signed_A yang berisi kode berikut. Kode tersebut menggunakan atribut InternalsVisibleToAttribute untuk mendeklarasikan friend_signed_B sebagai rakitan teman.

    Alat dengan Nama yang Kuat menghasilkan kunci umum terbaru setiap kali dijalankan. Oleh karena itu, Anda harus mengganti kunci umum dalam kode berikut dengan kunci umum yang baru saja Anda buat, seperti yang ditunjukkan dalam contoh berikut.

    // 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. Kompilasi dan tanda tangani friend_signed_A dengan menggunakan perintah berikut.

    csc /target:library /keyfile:FriendAssemblies.snk friend_signed_A.cs  
    
    Vbc -target:library -keyfile:FriendAssemblies.snk friend_signed_A.vb  
    
  5. Buat file C# atau Visual Basic bernama friend_signed_A yang berisi kode berikut. Karena friend_signed_A menentukan friend_signed_B sebagai rakitan teman, kode dalam friend_signed_B dapat mengakses internal (C#) atau tipe Friend (Visual Basic) dan anggota dari friend_signed_A. File tersebut berisi kode berikut.

    // 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. Kompilasi dan tanda tangani friend_signed_A dengan menggunakan perintah berikut.

    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  
    

    Nama rakitan yang dihasilkan oleh kompilator harus cocok dengan nama rakitan teman yang diteruskan ke dalam atribut InternalsVisibleToAttribute. Anda harus secara eksplisit menentukan nama output rakitan (.exe atau .dll) dengan menggunakan opsi pengompilasi -out. Untuk informasi selengkapnya, lihat OutputAssembly (C# opsi kompilator) atau -out (Visual Basic).

  7. Jalankan file friend_signed_B.exe.

    Program menghasilkan string Class1.Test.

Keamanan .NET

Ada kesamaan antara atribut InternalsVisibleToAttribute dan kelas StrongNameIdentityPermission. Perbedaan utamanya adalah StrongNameIdentityPermission dapat meminta izin keamanan untuk menjalankan bagian kode tertentu, sedangkan atribut InternalsVisibleToAttribute mengontrol visibilitas jenis dan anggota internal(C#) atau Friend (Visual Basic).

Lihat juga