InternalsVisibleToAttribute(String) Konstruktor
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menginisialisasi instans baru kelas InternalsVisibleToAttribute 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 atribut InternalsVisibleToAttribute untuk membuat metode internal
bernama AppendDirectorySeparator
dalam rakitan yang ditandatangani yang terlihat oleh rakitan lain yang ditandatangani. Ini mendefinisikan kelas FileUtilities
yang mencakup metode AppendDirectorySeparator
internal. Atribut InternalsVisibleToAttribute diterapkan ke rakitan yang berisi kelas FileUtilities
. 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 metode FileUtilities.AppendDirectorySeparator
, meskipun metodenya internal untuk rakitan Assembly1
. Perhatikan bahwa jika Anda mengkompilasi C# dari baris perintah, Anda harus menggunakan sakelar
//
// 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 atribut InternalsVisibleToAttribute untuk membuat anggota internal
rakitan yang tidak ditandatangani terlihat oleh rakitan lain yang tidak ditandatangani. Atribut memastikan bahwa metode internal
StringLib.IsFirstLetterUpperCase
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 rakitan Friend2
. Perhatikan bahwa jika Anda mengkompilasi C# dari baris perintah, Anda harus menggunakan sakelar
#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
Konstruktor InternalsVisibleToAttribute mendefinisikan perakitan teman, yang merupakan perakitan yang memiliki akses ke jenis internal dan privat yang dilindungi 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 Membuat dan menggunakan rakitan bernama kuat.) Jika keduanya tidak ditandatangani, argumen assemblyName
terdiri dari nama perakitan teman, yang 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 dari nama yang kuat, seperti yang menyediakan informasi arsitektur budaya, versi, atau prosesor, tidak dapat ditentukan dalam argumen assemblyName
.
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. Ini diperlukan karena pengkompilasi belum menghasilkan nama untuk rakitan yang dibangunnya pada saat mengikat referensi eksternal. Opsi pengkompilasi
Anda dapat menggunakan
Ekstrak kunci publik dari file kunci bernama kuat ke file terpisah:
outfile
Sn -p snk_file Tampilkan kunci publik lengkap ke konsol:
Sn -tpoutfile
Salin dan tempel nilai kunci publik lengkap ke dalam kode sumber Anda.
Untuk informasi selengkapnya tentang cara menggunakan atribut InternalsVisibleToAttribute, lihat artikel berikut ini: