Bagikan melalui


Pertemuan teman

Rakitan teman adalah rakitan yang dapat mengakses jenis dan anggota internal assembly (C#) atau Teman (Visual Basic) lain. Jika Anda menambahkan atribut assembly ke AssemblyA untuk mengidentifikasi AssemblyB sebagai assembly teman, Anda tidak perlu lagi menandai jenis dan anggota di AssemblyA sebagai publik untuk dapat diakses oleh AssemblyB. Ini sangat nyaman dalam skenario berikut:

  • Selama pengujian unit, ketika kode pengujian berjalan di rakitan terpisah tetapi memerlukan akses ke anggota dalam rakitan yang diuji yang ditandai sebagai internal dalam C# atau Friend di Visual Basic.

  • Saat Anda mengembangkan pustaka kelas dan penambahannya terdapat dalam rakitan terpisah tetapi memerlukan akses ke member di rakitan yang ada yang ditandai sebagai internal di C# atau Friend di Visual Basic.

Komentar

Anda dapat menggunakan InternalsVisibleToAttribute atribut untuk mengidentifikasi satu atau beberapa rakitan teman untuk rakitan tertentu. Contoh berikut menggunakan InternalsVisibleToAttribute atribut di AssemblyA dan menentukan AssemblyB sebagai assemblai teman. Ini memberikan akses Assembly AssemblyB ke semua jenis dan anggota di Assembly A yang ditandai sebagai internal dalam C# atau Friend di Visual Basic.

Nota

Saat Anda mengkompilasi rakitan seperti AssemblyB yang akan mengakses jenis internal atau anggota internal rakitan lain seperti AssemblyA, Anda harus secara eksplisit menentukan nama file output (.exe atau .dll) dengan menggunakan opsi kompilator -out . Ini diperlukan karena pengkompilasi belum menghasilkan nama untuk rakitan yang dibangunnya pada saat mengikat referensi eksternal. Untuk informasi selengkapnya, lihat OutputAssembly (C#) atau -out (Visual Basic).

using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]

// The class is internal by default.
class FriendClass
{
    public void Test()
    {
        Console.WriteLine("Sample Class");
    }
}

// Public class that has an internal method.
public class ClassWithFriendMethod
{
    internal void Test()
    {
        Console.WriteLine("Sample Method");
    }

}
Imports System.Runtime.CompilerServices
<Assembly: InternalsVisibleTo("AssemblyB")>

' Friend class.
Friend Class FriendClass
    Public Sub Test()
        Console.WriteLine("Sample Class")
    End Sub
End Class

' Public class with a Friend method.
Public Class ClassWithFriendMethod
    Friend Sub Test()
        Console.WriteLine("Sample Method")
    End Sub
End Class

Hanya assembly yang Anda tentukan secara eksplisit sebagai teman yang dapat mengakses tipe dan anggota internal (C#) atau Friend (Visual Basic). Misalnya, jika AssemblyB adalah teman Assembly A dan Assembly C mereferensikan AssemblyB, Assembly C tidak memiliki akses ke internal jenis (C#) atau Friend (Visual Basic) di Assembly A.

Kompiler melakukan beberapa validasi dasar nama assembly teman yang diteruskan ke atribut InternalsVisibleToAttribute. Jika Assembly A menyatakan AssemblyB sebagai rakitan teman, aturan validasinya adalah sebagai berikut:

  • Jika Assembly A memiliki nama yang kuat, AssemblyB juga harus diberi nama yang kuat. Nama majelis sahabat yang diteruskan ke atribut harus terdiri dari nama majelis dan kunci publik dari kunci nama kuat yang digunakan untuk menandatangani AssemblyB.

    Nama assembly teman yang diteruskan ke InternalsVisibleToAttribute atribut tidak boleh menjadi nama kuat AssemblyB. Jangan sertakan versi perakitan, budaya, arsitektur, atau token kunci publik.

  • Jika Assembly A tidak bernama kuat, nama rakitan teman harus terdiri hanya dari nama rakitan. Untuk informasi selengkapnya, lihat Cara: Membuat rakitan teman yang tidak ditandatangani.

  • Jika AssemblyB diberi nama yang kuat, Anda harus menentukan kunci nama kuat untuk AssemblyB dengan menggunakan pengaturan proyek atau opsi pengkompilasi baris /keyfile perintah. Untuk informasi selengkapnya, lihat Cara: Membuat rakitan teman yang ditandatangani.

Kelas ini StrongNameIdentityPermission juga menyediakan kemampuan untuk berbagi jenis, dengan perbedaan berikut:

  • StrongNameIdentityPermission berlaku untuk tipe individu, sementara rakitan teman berlaku untuk seluruh rakitan.

  • Jika ada ratusan jenis di Assembly A yang ingin Anda bagikan dengan AssemblyB, Anda harus menambahkan StrongNameIdentityPermission ke semuanya. Jika Anda menggunakan assembly teman, Anda hanya perlu menyatakan hubungan teman sekali.

  • Jika Anda menggunakan StrongNameIdentityPermission, jenis yang ingin Anda bagikan harus dideklarasikan sebagai publik. Jika Anda menggunakan assembly sahabat, tipe yang dibagikan dinyatakan sebagai internal (C#) atau Friend (Visual Basic).

Untuk informasi tentang cara mengakses jenis dan metode assembly internal (C#) atau Friend (Visual Basic) dari file modul (file dengan ekstensi .netmodule ), lihat ModuleAssemblyName (C#) atau -moduleassemblyname (Visual Basic).

Lihat juga