共用方式為


InternalsVisibleToAttribute(String) 建構函式

定義

使用指定之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 屬性,讓另一個已簽署元件看見的已簽署元件中名為 AppendDirectorySeparatorinternal 方法。 它會定義包含內部 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 之元件中的 internalStringLib.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) 檔案擷取完整的公鑰。 若要這樣做,請執行下列步驟:

  1. 將公鑰從強名稱金鑰檔案擷取至個別的檔案:

    Sn -psnk_fileoutfile

  2. 向主控台顯示完整的公鑰:

    Sn -tpoutfile

  3. 將完整的公鑰值複製並貼到您的原始程式碼中。

如需如何使用 InternalsVisibleToAttribute 屬性的詳細資訊,請參閱下列文章:

適用於