Share via


InternalsVisibleToAttribute(String) Konstruktor

Definisi

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

public:
 InternalsVisibleToAttribute(System::String ^ assemblyName);
public InternalsVisibleToAttribute (string assemblyName);
new System.Runtime.CompilerServices.InternalsVisibleToAttribute : string -> System.Runtime.CompilerServices.InternalsVisibleToAttribute
Public Sub New (assemblyName As String)

Parameter

assemblyName
String

Nama perakitan teman.

Contoh

Rakitan yang ditandatangani

Contoh berikut menggunakan InternalsVisibleToAttribute atribut untuk membuat internal metode bernama AppendDirectorySeparator dalam rakitan yang ditandatangani terlihat oleh rakitan lain yang ditandatangani. Ini mendefinisikan FileUtilities kelas yang mencakup metode internal AppendDirectorySeparator . Atribut InternalsVisibleToAttribute diterapkan ke assembly yang berisi FileUtilities kelas . Atribut ini 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 bernama kuat bernama Friend1, itu dapat berhasil memanggil FileUtilities.AppendDirectorySeparator metode , meskipun metode bersifat internal untuk perakitan Assembly1 . 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.

//
// The assembly that exposes its internal types to this assembly should be
// named Assembly1.dll.
//
// The public key of this assembly should correspond to the public key
// specified in the class constructor of the InternalsVisibleTo attribute in the
// Assembly1 assembly.
//
#using <Assembly1.dll> as_friend

using namespace System;

void main()
{
   String^ dir = L"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.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 = FileUtilities.AppendDirectorySeparator(dir)
      Console.WriteLine(dir)
   End Sub
End Module
' The example displays the following output:
'       C:\Program Files\

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

Rakitan yang tidak ditandatangani

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 <UtilityLib.dll> as_friend

using namespace System;
using namespace Utilities::StringUtilities;

void main()
{
   String^ s = "The Sign of the Four";
   Console::WriteLine(StringLib::IsFirstLetterUpperCase(s));
}
using System;
using Utilities.StringUtilities;

public class Example
{
   public static void Main()
   {
      String s = "The Sign of the Four";
      Console.WriteLine(StringLib.IsFirstLetterUpperCase(s));
   }
}
Imports Utilities.StringUtilities

Module Example
   Public Sub Main()
      Dim s As String = "The Sign of the Four"
      Console.WriteLine(StringLib.IsFirstLetterUpperCase(s))
   End Sub
End Module

Keterangan

InternalsVisibleToAttribute Konstruktor mendefinisikan perakitan teman, yang merupakan perakitan yang memiliki akses ke jenis yang dilindungi internal dan privat dan anggota rakitan saat ini.

Rakitan saat ini dan perakitan teman harus tidak ditandatangani, atau keduanya harus ditandatangani dengan nama yang kuat. (Untuk informasi selengkapnya tentang rakitan bernama kuat, lihat Create dan gunakan rakitan bernama kuat.) Jika keduanya tidak ditandatangani, assemblyName argumen terdiri dari nama perakitan teman, ditentukan tanpa jalur direktori atau ekstensi file. Jika keduanya ditandatangani, assemblyName terdiri dari nama perakitan teman tanpa jalur direktori atau ekstensi nama file, bersama dengan kunci publik lengkapnya (tetapi bukan token kunci publiknya). Komponen lain dengan nama yang kuat, seperti komponen yang menyediakan informasi arsitektur budaya, versi, atau prosesor, tidak dapat ditentukan dalam assemblyName argumen .

Penting

Jika Anda menggunakan pengkompilasi C# untuk mengkompilasi perakitan teman, Anda harus secara eksplisit menentukan nama file output (.exe atau .dll) dengan menggunakan opsi kompilator /out . Hal ini diperlukan karena pengompilasi belum membuat nama untuk perakitan yang sedang dibuatnya pada saat mengikat ke 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#.

Anda dapat menggunakan Sn.exe (Alat Nama Kuat) 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 bernama kuat ke file terpisah:

    Sn -psnk_fileoutfile

  2. Tampilkan kunci umum lengkap ke konsol:

    Sn -tpoutfile

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

Untuk informasi selengkapnya tentang cara menggunakan InternalsVisibleToAttribute atribut , lihat artikel berikut ini:

Berlaku untuk