Share via


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 使用 屬性,讓 internal 另一個已簽署元件看見已簽署元件中名為 AppendDirectorySeparator 的方法。 它會定義 FileUtilities 包含內部 AppendDirectorySeparator 方法的類別。 屬性 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 另一個未簽署元件看見未簽署元件的成員。 屬性可確保 internalStringLib.IsFirstLetterUpperCase 名為 UtilityLib 之元件中的 方法對名為 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元件都必須不帶正負號,或者兩者都必須以強名稱簽署。 (如需強名稱元件的詳細資訊,請參閱 Create 並使用強名稱元件。) 如果兩者都是不帶正負號,自assemblyName變數是由friend元件的名稱所組成,而未指定目錄路徑或擴展名。 如果兩者都已簽署, assemblyName 則由沒有其目錄路徑或擴展名的friend元件名稱,以及其完整公鑰 (,但不包含其公鑰令牌) 。 強名稱的其他元件,例如提供文化特性、版本或處理器架構資訊的元件,無法在 自變數中 assemblyName 指定。

重要

如果您使用 C# 編譯程式編譯 friend 元件,則必須使用 /out 編譯程式選項,明確地指定輸出檔的名稱 (.exe 或 .dll) 。 因為編譯器尚未針對在繫結至外部參考時所建立的組件產生名稱,所以這是必要動作。 /out 編譯程式選項是 Visual Basic 編譯程式的選擇性選項,當使用 F# 編譯程式編譯 friend 元件時,不應該使用對應的 -out-o 編譯程式選項。

您可以使用 Sn.exe (強名稱工具) ,從強名稱密鑰 (.snk) 檔案擷取完整的公鑰。 若要這樣做,請執行下列步驟:

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

    Sn -psnk_fileoutfile

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

    Sn -tpoutfile

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

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

適用於