InternalsVisibleToAttribute Kelas

Definisi

Menentukan bahwa jenis yang biasanya hanya terlihat dalam rakitan saat ini terlihat oleh rakitan tertentu.

public ref class InternalsVisibleToAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
public sealed class InternalsVisibleToAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)>]
type InternalsVisibleToAttribute = class
    inherit Attribute
Public NotInheritable Class InternalsVisibleToAttribute
Inherits Attribute
Warisan
InternalsVisibleToAttribute
Atribut

Contoh

Rakitan yang ditandatangani

Contoh berikut menggunakan InternalsVisibleToAttribute atribut untuk membuat metode bernama internalAppendDirectorySeparator dalam rakitan yang ditandatangani terlihat oleh rakitan lain yang ditandatangani. Ini mendefinisikan FileUtilities kelas yang mencakup metode internal AppendDirectorySeparator . Atribut InternalsVisibleToAttribute diterapkan ke rakitan yang berisi FileUtilities kelas . Atribut memungkinkan rakitan bernama Friend1 untuk mengakses anggota internal ini.

//
// The source code should be saved in a file named Example1.cs. It 
// can be compiled at the command line as follows:
//
//    csc /t:library /keyfile:<snkfilename> Assembly1.cs
//
// The public key of the Friend1 file should be changed to the full
// public key stored in your strong-named key file.
//
using System;
using System.IO;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("Friend1, PublicKey=002400000480000094" + 
                              "0000000602000000240000525341310004000" +
                              "001000100bf8c25fcd44838d87e245ab35bf7" +
                              "3ba2615707feea295709559b3de903fb95a93" +
                              "3d2729967c3184a97d7b84c7547cd87e435b5" +
                              "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" +
                              "712da72eec2533dc00f8529c3a0bbb4103282" +
                              "f0d894d5f34e9f0103c473dce9f4b457a5dee" +
                              "fd8f920d8681ed6dfcb0a81e96bd9b176525a" +
                              "26e0b3")]

public class FileUtilities
{
   internal static string AppendDirectorySeparator(string dir)
   {
      if (!dir.Trim().EndsWith(Path.DirectorySeparatorChar.ToString()))
         return dir.Trim() + Path.DirectorySeparatorChar;
      else
         return dir;
   }
}
'
' The source code should be saved in a file named Example1.cs. It 
' can be compiled at the command line as follows:
'
'    vbc Assembly1.vb /t:library /keyfile:<snkfilename> 
'
' The public key of the Friend1 file should be changed to the full
' public key stored in your strong-named key file.
'
Imports System.IO
Imports System.Runtime.CompilerServices

<Assembly:InternalsVisibleTo("Friend1, PublicKey=002400000480000094" + _
                             "0000000602000000240000525341310004000" + _
                             "001000100bf8c25fcd44838d87e245ab35bf7" + _
                             "3ba2615707feea295709559b3de903fb95a93" + _
                             "3d2729967c3184a97d7b84c7547cd87e435b5" + _
                             "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" + _
                             "712da72eec2533dc00f8529c3a0bbb4103282" + _
                             "f0d894d5f34e9f0103c473dce9f4b457a5dee" + _
                             "fd8f920d8681ed6dfcb0a81e96bd9b176525a" + _
                             "26e0b3")>

Public Class FileUtilities
   Friend Shared Function AppendDirectorySeparator(dir As String) As String
      If Not dir.Trim().EndsWith(Path.DirectorySeparatorChar) Then
         Return dir.Trim() + Path.DirectorySeparatorChar
      Else
         Return dir
      End If   
   End Function
End Class

Jika contoh berikut dikompilasi ke dalam rakitan Friend1bernama kuat , Example.Main metode di Friend1 dapat berhasil memanggil FileUtilities.AppendDirectorySeparator metode , meskipun metode bersifat internal untuk Assembly1 rakitan. Jika Anda mengkompilasi C# dari baris perintah, Anda harus menggunakan sakelar pengkompilasi /out untuk memastikan bahwa nama perakitan teman tersedia saat pengkompilasi mengikat ke referensi eksternal.

//
// The source code should be saved in a file named Friend1.cs. It 
// can be compiled at the command line as follows:
//
//    csc /r:Assembly1.dll /keyfile:<snkfilename> /out:Friend1.dll Friend1.cs
//
// The public key of the Friend1 assembly should correspond to the public key
// specified in the class constructor of the InternalsVisibleTo attribute in the
// Assembly1 assembly.
//
using System;

public class Example
{
   public static void Main()
   {
      string dir = @"C:\Program Files";
      dir = FileUtilities.AppendDirectorySeparator(dir);
      Console.WriteLine(dir);
   }
}
// The example displays the following output:
//       C:\Program Files\
'
' The source code should be saved in a file named Friend1.vb. It 
' can be compiled at the command line as follows:
'
'    vbc Friend1.vb /r:Assembly1.dll /keyfile:<snkfilename> 
'
' The public key of the Friend1 assembly should correspond to the public key
' specified in the class constructor of the InternalsVisibleTo attribute in the
' Assembly1 assembly.
'
Module Example
   Public Sub Main()
      Dim dir As String = "C:\Program Files"
        dir = FileUtilities1.AppendDirectorySeparator(dir)
        Console.WriteLine(dir)
   End Sub
End Module
' The example displays the following output:
'       C:\Program Files\

Rakitan yang tidak ditandatangani

Contoh berikut menggunakan InternalsVisibleToAttribute atribut untuk membuat internal anggota rakitan yang tidak ditandatangani terlihat oleh rakitan lain yang tidak ditandatangani. Atribut memastikan bahwa internalStringLib.IsFirstLetterUpperCase metode dalam rakitan bernama UtilityLib terlihat oleh kode dalam rakitan bernama Friend2. Berikut ini adalah kode sumber untuk UtilityLib.dll:

using System;
using System.Runtime.CompilerServices;

[assembly: InternalsVisibleToAttribute("Friend2")]

namespace Utilities.StringUtilities
{
   public class StringLib
   {
      internal static bool IsFirstLetterUpperCase(String s)
      {
         string first = s.Substring(0, 1);
         return first == first.ToUpper();
      }
   }
}

Imports System.Runtime.CompilerServices

<assembly: InternalsVisibleTo("Friend2")>

Namespace Utilities.StringUtilities
   Public Class StringLib
      Friend Shared Function IsFirstLetterUpperCase(s As String) As Boolean
         Dim first As String = s.Substring(0, 1)
         Return first = first.ToUpper()
      End Function
   End Class
End Namespace

Contoh berikut menyediakan kode sumber untuk assembly Friend2 . Perhatikan bahwa jika Anda mengkompilasi C# dari baris perintah, Anda harus menggunakan sakelar pengkompilasi /out untuk memastikan bahwa nama perakitan teman tersedia saat pengkompilasi mengikat ke referensi eksternal.

using System;

public class Example1
{
   public static void Main()
   {
      String s = "The Sign of the Four";
      //Console.WriteLine(Utilities.StringUtilities.StringLib.IsFirstLetterUpperCase(s));
   }
}
Module Example1
    Public Sub Main()
        Dim s As String = "The Sign of the Four"
        ' Console.WriteLine(Utilities.StringUtilities.StringLib.IsFirstLetterUpperCase(s))
    End Sub
End Module

Keterangan

Atribut InternalsVisibleToAttribute menentukan bahwa jenis yang biasanya hanya terlihat dalam rakitan saat ini terlihat oleh rakitan tertentu.

Seharusnya, jenis dan anggota dengan internal cakupan dalam C# atau Friend cakupan di Visual Basic hanya terlihat dalam assembly tempat mereka didefinisikan. Jenis dan anggota dengan cakupan protected internal (cakupan Protected Friend di Visual Basic) hanya terlihat di rakitan mereka sendiri atau ke tipe yang berasal dari kelas yang menaunginya. Jenis dan anggota dengan cakupan private protected (cakupan Private Protected dalam Visual Basic) terlihat di kelas yang berisi atau dalam jenis yang berasal dari kelas yang berisi dalam rakitan saat ini.

Atribut InternalsVisibleToAttribute membuat jenis dan anggota ini juga terlihat oleh jenis dalam rakitan tertentu, yang dikenal sebagai rakitan teman. Ini hanya berlaku untuk anggota internal (Friend di Visual Basic), anggota protected internal(Protected Friend di Visual Basic), dan anggota private protected (Private Protected di Visual Basic), tetapi tidak untuk anggota private.

Note

Dalam kasus anggota private protected (Private Protected dalam Visual Basic), atribut InternalsVisibleToAttribute hanya memperluas aksesibilitas ke tipe yang diturunkan dari kelas yang mengandung anggota.

Atribut diterapkan pada tingkat perakitan. Ini berarti bahwa file tersebut dapat disertakan di awal file kode sumber, atau dapat disertakan dalam file AssemblyInfo dalam proyek Visual Studio. Anda dapat menggunakan atribut untuk mendefinisikan satu assembly teman yang dapat mengakses tipe dan anggota internal dari assembly saat ini. Anda dapat menentukan beberapa rakitan teman dengan dua cara. Mereka dapat muncul sebagai atribut tingkat rakitan individual, seperti yang diilustrasikan contoh berikut.

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>

Mereka juga dapat muncul dengan tag InternalsVisibleToAttribute terpisah tetapi satu kata kunci assembly, seperti yang diilustrasikan dalam contoh berikut.

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
 Assembly:InternalsVisibleTo("Friend2b")>

Perakitan sahabat diidentifikasi oleh konstruktur InternalsVisibleToAttribute. Rakitan saat ini dan rakitan mitra harus tidak ditandatangani, atau kedua rakitan harus ditandatangani dengan nama yang kuat.

Jika kedua rakitan tidak ditandatangani, argumen assemblyName terdiri dari nama rakitan teman, yang ditentukan tanpa jalur direktori atau ekstensi nama file.

Jika kedua rakitan ditandatangani dengan nama yang kuat, argumen untuk konstruktor InternalsVisibleToAttribute harus terdiri dari nama rakitan tanpa jalur direktori atau ekstensi nama file, serta kunci publik lengkap (bukan token kunci publiknya). Untuk mendapatkan kunci publik lengkap dari assembly bernama kuat, periksa bagian Dapatkan kunci publik lengkap di artikel ini. Untuk informasi selengkapnya tentang menggunakan InternalsVisibleToAttribute dengan rakitan dengan nama kuat, lihat InternalsVisibleToAttribute konstruktor.

Jangan sertakan nilai untuk bidang CultureInfo, Version, atau ProcessorArchitecture dalam argumen; pengkompilasi Visual Basic, C#, dan C++ menemukan ini sebagai kesalahan pengkompilasi. Jika Anda menggunakan pengkompilasi yang tidak memperlakukannya sebagai kesalahan (seperti Perakit IL (ILAsm.exe)) dan rakitan diberi nama kuat, MethodAccessException pengecualian akan muncul ketika pertama kali rakitan teman yang ditentukan mengakses rakitan yang berisi InternalsVisibleToAttribute atribut.

Untuk informasi selengkapnya tentang cara menggunakan atribut ini, lihat rakitan Teman dan rakitan teman C++.

Dapatkan kunci publik lengkap

Anda dapat menggunakan Alat Nama Kuat (Sn.exe) untuk mengambil kunci publik lengkap dari file kunci bernama kuat (.snk). Untuk melakukan ini, Anda melakukan langkah-langkah berikut:

  1. Ekstrak kunci publik dari file kunci dengan nama kuat ke dalam file terpisah.

    Sn -p <snk_file> <outfile>

  2. Tampilkan kunci publik lengkap ke konsol:

    Sn -tp <outfile>

  3. Salin dan tempel nilai kunci publik lengkap ke dalam kode sumber Anda.

Kompilasi assembly teman dengan C#

Jika Anda menggunakan compiler C# untuk mengkompilasi assembly teman, Anda harus secara eksplisit menentukan nama file output (.exe atau .dll) dengan menggunakan opsi compiler /out. Ini diperlukan karena pengkompilasi belum menghasilkan nama untuk rakitan yang dibangunnya pada saat mengikat referensi eksternal. Opsi pengkompilasi /out bersifat opsional untuk pengkompilasi Visual Basic, dan opsi pengkompilasi -out atau -o yang sesuai tidak boleh digunakan saat mengkompilasi rakitan teman dengan pengkompilasi F#.

Kompilasi perakitan sahabat menggunakan C++

Di C++, untuk membuat anggota internal diaktifkan oleh atribut InternalsVisibleToAttribute yang dapat diakses oleh assemblies teman, Anda harus menggunakan atribut as_friend dalam arahan di C++. Untuk informasi selengkapnya, lihat Rakitan Teman (C++).

Konstruktor

Nama Deskripsi
InternalsVisibleToAttribute(String)

Menginisialisasi instans InternalsVisibleToAttribute baru kelas dengan nama perakitan teman yang ditentukan.

Properti

Nama Deskripsi
AllInternalsVisible

Properti ini tidak diimplementasikan.

AssemblyName

Mendapatkan nama rakitan teman tempat semua jenis dan jenis anggota yang ditandai dengan internal kata kunci akan dibuat terlihat.

TypeId

Ketika diimplementasikan dalam kelas turunan, mendapatkan pengidentifikasi unik untuk Attributeini.

(Diperoleh dari Attribute)

Metode

Nama Deskripsi
Equals(Object)

Mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
GetHashCode()

Mengembalikan kode hash untuk instans ini.

(Diperoleh dari Attribute)
GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
IsDefaultAttribute()

Ketika ditimpa dalam kelas turunan, menunjukkan apakah nilai instans ini adalah nilai default untuk kelas turunan.

(Diperoleh dari Attribute)
Match(Object)

Saat ditimpa dalam kelas turunan, mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Implementasi Antarmuka Eksplisit

Nama Deskripsi
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Memetakan sekumpulan nama ke sekumpulan pengidentifikasi pengiriman yang sesuai.

(Diperoleh dari Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Mengambil informasi jenis untuk objek, yang dapat digunakan untuk mendapatkan informasi jenis untuk antarmuka.

(Diperoleh dari Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Mengambil jumlah antarmuka informasi jenis yang disediakan objek (baik 0 atau 1).

(Diperoleh dari Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Menyediakan akses ke properti dan metode yang diekspos oleh objek.

(Diperoleh dari Attribute)

Berlaku untuk