Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Contoh ini menunjukkan cara menggunakan rakitan teman dengan rakitan yang tidak ditandatangani.
Membuat rakitan dan rakitan teman
Buka prompt perintah.
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 ClassKompilasi dan tandatangani friend_unsigned_A dengan menggunakan perintah berikut:
csc /target:library friend_unsigned_A.csvbc -target:library friend_unsigned_A.vbBuat 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#) atauFriendjenis (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 ModuleKompilasi friend_unsigned_B dengan menggunakan perintah berikut.
csc /r:friend_unsigned_A.dll /out:friend_unsigned_B.exe friend_unsigned_B.csvbc -r:friend_unsigned_A.dll friend_unsigned_B.vbNama 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).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.