InternalsVisibleToAttribute(String) 建構函式
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
使用指定之friend元件的名稱,初始化 InternalsVisibleToAttribute 類別的新實例。
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)
參數
- assemblyName
- String
friend 元件的名稱。
範例
簽署的元件
下列範例會使用 InternalsVisibleToAttribute 屬性,讓另一個已簽署元件看見的已簽署元件中名為 AppendDirectorySeparator
的 internal
方法。 它會定義包含內部 AppendDirectorySeparator
方法的 FileUtilities
類別。
InternalsVisibleToAttribute 屬性會套用至包含 FileUtilities
類別的元件。 屬性可讓名為 Friend1
的元件存取這個內部成員。
//
// 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
如果下列範例編譯成名為 Friend1
的強名稱元件,即使方法位於 Assembly1
元件內部,它仍可成功呼叫 FileUtilities.AppendDirectorySeparator
方法。 請注意,如果您要從命令行以 C# 編譯,您必須使用 /out 編譯程式參數,以確保編譯程式系結至外部參考時,可以使用 friend 元件的名稱。
//
// 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\
下列範例會使用 InternalsVisibleToAttribute 屬性,讓另一個未簽署元件看到未簽署元件的 internal
成員。 屬性可確保名為 UtilityLib
之元件中的 internal
StringLib.IsFirstLetterUpperCase
方法,在名為 Friend2
的元件中可以看到程序代碼。 以下是 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
未簽署的元件
下列範例提供 Friend2
元件的原始程式碼。 請注意,如果您要從命令行以 C# 編譯,您必須使用 /out 編譯程式參數,以確保編譯程式系結至外部參考時,可以使用 friend 元件的名稱。
#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
備註
InternalsVisibleToAttribute 建構函式會定義friend元件,這是可存取目前元件之內部和私人受保護型別和成員的元件。
目前的元件和friend元件都必須不帶正負號,或者兩者都必須以強名稱簽署。 (如需強名稱元件的詳細資訊,請參閱 建立和使用強名稱元件。如果兩者都未帶正負號,則 assemblyName
自變數是由未指定目錄路徑或擴展名之friend元件的名稱所組成。 如果兩者都已簽署,assemblyName
是由沒有其目錄路徑或擴展名之friend元件的名稱,以及其完整公鑰(但不包含其公鑰令牌)。 強名稱的其他元件,例如提供文化特性、版本或處理器架構資訊的元件,無法在 assemblyName
自變數中指定。
重要
如果您使用 C# 編譯程式編譯 friend 元件,則必須使用 / out 編譯程式選項,明確指定輸出檔的名稱 (.exe 或 .dll)。 這是必要的,因為編譯程式尚未產生它在系結至外部參考時所建置之元件的名稱。 Visual Basic 編譯程式的 /out 編譯程式選項是選擇性的,而且使用 F# 編譯程式編譯程式編譯 friend 元件時,不應該使用對應的 -out 或 -o 編譯程序選項。
您可以使用 Sn.exe (強名稱工具),從強名稱密鑰 (.snk) 檔案擷取完整的公鑰。 若要這樣做,請執行下列步驟:
將公鑰從強名稱金鑰檔案擷取至個別的檔案:
Sn -psnk_fileoutfile
向主控台顯示完整的公鑰:
Sn -tpoutfile
將完整的公鑰值複製並貼到您的原始程式碼中。
如需如何使用 InternalsVisibleToAttribute 屬性的詳細資訊,請參閱下列文章: