InternalsVisibleToAttribute クラス

定義

通常は現在のアセンブリ内でのみ参照できる型が、指定したアセンブリから参照可能であることを指定します。

public ref class InternalsVisibleToAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)]
public sealed class InternalsVisibleToAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Assembly, AllowMultiple=true, Inherited=false)>]
type InternalsVisibleToAttribute = class
    inherit Attribute
Public NotInheritable Class InternalsVisibleToAttribute
Inherits Attribute
継承
InternalsVisibleToAttribute
属性

署名されたアセンブリ

次の例では、属性を使用して、 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 Example.Main Friend1 FileUtilities.AppendDirectorySeparator アセンブリの内部にありますが、のメソッドは正常にメソッドを呼び出すことができ Assembly1 ます。 コマンドラインから C# でコンパイルする場合は、 /out コンパイラスイッチを使用して、コンパイラが外部参照にバインドするときにフレンドアセンブリの名前を使用できるようにする必要があることに注意してください。

//
// 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 署名されていないアセンブリのメンバーを別の未署名のアセンブリに参照できるようにします。 属性を指定すると、という名前の internal StringLib.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 コンパイラスイッチを使用して、コンパイラが外部参照にバインドするときにフレンドアセンブリの名前を使用できるようにする必要があることに注意してください。

#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

注釈

通常、 internal C# のスコープを持つ型およびメンバー、または Friend Visual Basic 内のスコープは、それらが定義されているアセンブリ内でのみ表示されます。 スコープを持つ型とメンバー protected internal ( Protected Friend Visual Basic 内のスコープ) は、独自のアセンブリまたはそれを含んでいるクラスから派生した型にのみ表示されます。 スコープを持つ型とメンバー private protected ( Private Protected Visual Basic 内のスコープ) は、それを含んでいるクラスまたは現在のアセンブリ内の含まれるクラスから派生した型で表示されます。

InternalsVisibleToAttribute属性を使用すると、これらの型およびメンバーは、フレンドアセンブリと呼ばれる、指定されたアセンブリ内の型にも表示されます。 これは、 internal ( Friend Visual Basic)、 protected internal ( Protected Friend Visual Basic)、および private protected (Visual Basic) Private Protected メンバー private にのみ適用されますが、メンバーは含まれません。

注意

private protected( Private Protected Visual Basic) メンバーの場合、属性は、 InternalsVisibleToAttribute メンバーの 親クラス から派生した型に対してのみアクセシビリティを拡張します。

属性は、アセンブリレベルで適用されます。 これは、ソースコードファイルの先頭に含めることも、Visual Studio プロジェクトの AssemblyInfo ファイルに含めることもできることを意味します。 属性を使用して、現在のアセンブリの内部型およびメンバーにアクセスできる単一のフレンドアセンブリを指定できます。 複数のフレンドアセンブリを定義するには、次の2つの方法があります。 これらは、次の例に示すように、個々のアセンブリレベル属性として表示できます。

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]
<assembly:InternalsVisibleTo("Friend1a")>
<assembly:InternalsVisibleTo("Friend1b")>

また、 InternalsVisibleToAttribute 次の例に示すように、個別のタグでも1つのキーワードでも表示でき assembly ます。

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]
<Assembly:InternalsVisibleTo("Friend2a"), _
 Assembly:InternalsVisibleTo("Friend2b")>

フレンドアセンブリは、コンストラクターによって識別され InternalsVisibleToAttribute ます。 現在のアセンブリとフレンドアセンブリの両方が符号なしであるか、または両方のアセンブリが厳密な名前で署名されている必要があります。

両方のアセンブリが符号なしである場合、 assemblyName 引数はディレクトリパスまたはファイル名拡張子なしで指定されたフレンドアセンブリの名前で構成されます。

両方のアセンブリが厳密な名前で署名されている場合、コンストラクターの引数は、 InternalsVisibleToAttribute ディレクトリパスまたはファイル名の拡張子を持たないアセンブリの名前と、完全な公開キー (公開キートークンではない) で構成されている必要があります。 厳密な名前付きアセンブリの完全な公開キーを取得するには、この記事で後述する「 完全な公開キーの取得 」セクションを参照してください。 を厳密な名前付きアセンブリと共に使用する方法の詳細については InternalsVisibleToAttribute 、コンストラクターを参照してください InternalsVisibleToAttribute

引数には、、、またはの各フィールドの値を含めないでください CultureInfo Version ProcessorArchitecture 。 Visual Basic、C#、および C++ コンパイラはこれをコンパイラエラーとして扱います。 エラーとして処理しないコンパイラ ( IL アセンブラー (ILAsm.exe)など) を使用していて、アセンブリに厳密な名前が付けられている場合は、 MethodAccessException 指定されたフレンドアセンブリが属性を含むアセンブリに初めてアクセスしたときに例外がスローされ InternalsVisibleToAttribute ます。

この属性の使用方法の詳細については、「 フレンドアセンブリ 」および「 C++ friend アセンブリ」を参照してください。

完全な公開キーを取得する

厳密 名ツール (Sn.exe) を使用して、厳密な名前のキー (.snk) ファイルから完全な公開キーを取得できます。 これを行うには、次の手順を実行します。

  1. 厳密な名前のキーファイルから別のファイルに公開キーを抽出します。

    Sn-psnk_file の出力

  2. 完全な公開キーをコンソールに表示します。

    Sn-tp 出力

  3. 完全な公開キーの値をコピーして、ソースコードに貼り付けます。

C を使用してフレンドアセンブリをコンパイルします。#

C# コンパイラを使用してフレンドアセンブリをコンパイルする場合は、 /out コンパイラオプションを使用して、出力ファイルの名前 (.exe または .dll) を明示的に指定する必要があります。 この指定は必ず行ってください。コンパイラが外部参照にバインドする時点ではまだ、ビルド中のアセンブリの名前が生成されていないためです。 /out コンパイラオプションは Visual Basic コンパイラでは省略可能であり、F # コンパイラを使用してフレンドアセンブリをコンパイルするときに、対応する out または -o コンパイラオプションを使用することはできません。

C++ を使用してフレンドアセンブリをコンパイルする

C++ では、属性によって有効にされた内部メンバーをフレンドアセンブリからアクセスできるようにするために、 InternalsVisibleToAttribute c++ ディレクティブで属性を使用する必要があり as_friend ます。 詳細については、「 フレンドアセンブリ (C++)」を参照してください。

コンストラクター

InternalsVisibleToAttribute(String)

指定したフレンド アセンブリの名前を使用して InternalsVisibleToAttribute クラスの新しいインスタンスを初期化します。

プロパティ

AllInternalsVisible

このプロパティは実装されていません。

AssemblyName

internal キーワードを使用してマークされている型と型のメンバーをすべて参照できるようにする、フレンド アセンブリの名前を取得します。

TypeId

派生クラスで実装されると、この Attribute の一意の識別子を取得します。

(継承元 Attribute)

メソッド

Equals(Object)

このインスタンスが、指定されたオブジェクトと等価であるかどうかを示す値を返します。

(継承元 Attribute)
GetHashCode()

このインスタンスのハッシュ コードを返します。

(継承元 Attribute)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
IsDefaultAttribute()

派生クラスでオーバーライドされるとき、このインスタンスの値が派生クラスの既定値であるかどうかを示します。

(継承元 Attribute)
Match(Object)

派生クラス内でオーバーライドされたときに、指定したオブジェクトとこのインスタンスが等しいかどうかを示す値を返します。

(継承元 Attribute)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

明示的なインターフェイスの実装

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

一連の名前を対応する一連のディスパッチ識別子に割り当てます。

(継承元 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

オブジェクトの型情報を取得します。この情報はインターフェイスの型情報の取得に使用できます。

(継承元 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。

(継承元 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。

(継承元 Attribute)

適用対象