Bagikan melalui


Cara: Membuat rakitan teman yang tidak ditandatangani

Contoh ini menunjukkan cara menggunakan rakitan teman dengan rakitan yang tidak ditandatangani.

Membuat rakitan dan rakitan teman

  1. Buka prompt perintah.

  2. Buat file C# atau Visual Basic bernama friend_unsigned_A yang berisi kode berikut. Kode tersebut menggunakan atribut InternalsVisibleToAttribute untuk mendeklarasikan friend_unsigned_B sebagai rakitan teman.

    // friend_unsigned_A.cs
    // Compile with:
    // csc /target:library friend_unsigned_A.cs
    using System.Runtime.CompilerServices;
    using System;
    
    [assembly: InternalsVisibleTo("friend_unsigned_B")]
    
    // Type is internal by default.
    class Class1
    {
        public void Test()
        {
            Console.WriteLine("Class1.Test");
        }
    }
    
    // Public type with internal member.
    public class Class2
    {
        internal void Test()
        {
            Console.WriteLine("Class2.Test");
        }
    }
    
    ' friend_unsigned_A.vb
    ' Compile with:
    ' vbc -target:library friend_unsigned_A.vb
    Imports System.Runtime.CompilerServices
    
    <Assembly: InternalsVisibleTo("friend_unsigned_B")>
    
    ' Friend type.
    Friend Class Class1
        Public Sub Test()
            Console.WriteLine("Class1.Test")
        End Sub
    End Class
    
    ' Public type with Friend member.
    Public Class Class2
        Friend Sub Test()
            Console.WriteLine("Class2.Test")
        End Sub
    End Class
    
  3. Kompilasi dan tandatangani friend_unsigned_A dengan menggunakan perintah berikut:

    csc /target:library friend_unsigned_A.cs
    
    vbc -target:library friend_unsigned_A.vb
    
  4. Buat file C# atau Visual Basic bernama friend_unsigned_B yang berisi kode berikut. Karena friend_unsigned_A menentukan friend_unsigned_B sebagai rakitan teman, kode dalam friend_unsigned_B dapat mengakses internal (C#) atau Friend jenis (Visual Basic) dan anggota dari friend_unsigned_A.

    // friend_unsigned_B.cs
    // Compile with:
    // csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs
    public class Program
    {
        static void Main()
        {
            // Access an internal type.
            Class1 inst1 = new Class1();
            inst1.Test();
    
            Class2 inst2 = new Class2();
            // Access an internal member of a public type.
            inst2.Test();
    
            System.Console.ReadLine();
        }
    }
    
    ' friend_unsigned_B.vb
    ' Compile with:
    ' vbc -r:friend_unsigned_A.dll friend_unsigned_B.vb
    Module Module1
        Sub Main()
            ' Access a Friend type.
            Dim inst1 As New Class1()
            inst1.Test()
    
            Dim inst2 As New Class2()
            ' Access a Friend member of a public type.
            inst2.Test()
    
            System.Console.ReadLine()
        End Sub
    End Module
    
  5. Kompilasi friend_unsigned_B dengan menggunakan perintah berikut.

    csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.cs
    
    vbc -r:friend_unsigned_A.dll friend_unsigned_B.vb
    

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

  6. Jalankan file friend_unsigned_B.exe.

    Program ini menghasilkan dua string: Class1.Test dan Class2.Test.

Keamanan .NET

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

Lihat juga