フレンド アセンブリ (C++)

適切なランタイムでは、フレンド アセンブリ は、アセンブリ言語の機能は、一つ以上のクライアント アセンブリがアクセスできるアセンブリ コンポーネントの名前空間スコープまたはグローバル スコープまたはにある型を作成します。.netmodule。

すべてのランタイム

解説

(この言語機能はすべてのランタイムにいません)。

Windows ランタイム

解説

(この言語機能は Windows ランタイムではサポートされていません。)

ms177208.collapse_all(ja-jp,VS.110).gif要件

コンパイラ オプション: /ZW

共通言語ランタイム

解説

型をクライアント アセンブリがアクセスできるアセンブリ コンポーネントの名前空間スコープまたはグローバル スコープで実行する場合は。.netmodule にリンクできません。

  1. コンポーネントでは、アセンブリ属性 InternalsVisibleToAttributeを指定し、クライアント アセンブリの名前またはを渡します。コンポーネントの名前空間スコープまたはグローバル スコープで型にアクセスする.netmodule。または複数のクライアントのアセンブリを指定できます。追加の属性を指定することによって、.netmodule。

  2. クライアント アセンブリ、または。#usingを使用してコンポーネントのアセンブリを参照すると、.netmodule は as_friend の属性を渡します。InternalsVisibleToAttributeを指定しないアセンブリに as_friend の属性を指定すると、ランタイム例外は、コンポーネントの名前空間スコープまたはグローバル スコープで型にアクセスしようとするとスローされます。

ビルド エラーが InternalsVisibleToAttribute の属性を含むアセンブリが厳密な名前を持たないクライアントが発生します as_friend の属性を使用するアセンブリが。

名前空間スコープとグローバル スコープの型がクライアント アセンブリ、または知ることができます。ただし、メンバーのアクセシビリティは引き続き有効です。たとえば、プライベート メンバーにアクセスできません。

すべてのアクセスは、アセンブリを明示的に許可する必要があります。たとえば、C にすべてにアクセスできないアセンブリは 15 のアセンブリ B がアセンブリ B を参照し、B にすべてにアクセスできるアセンブリがアセンブリ A.を入力すると、アセンブリ A を入力します。

アセンブリ外の型のアクセシビリティを指定する方法の詳細については、型の可視性を参照してください。

使用方法の詳細に関するにはある記号、Visual C++ コンパイラを使用してビルド アセンブリに厳密な名前を付ける方法を、厳密名アセンブリ (アセンブリ署名) (C++/CLI)"を参照してください。

個々の型へのアクセスを制限するには、フレンド アセンブリ機能、使用する代わりに StrongNameIdentityPermission を使用できるようになります。

ms177208.collapse_all(ja-jp,VS.110).gif要件

コンパイラ オプション: /clr

ms177208.collapse_all(ja-jp,VS.110).gif

次のコード例では、コンポーネントでその型にアクセスできるクライアント アセンブリを指定するコンポーネントを定義します。

// friend_assemblies.cpp
// compile by using: /clr /LD
using namespace System::Runtime::CompilerServices;
using namespace System;
// an assembly attribute, not bound to a type
[assembly:InternalsVisibleTo("friend_assemblies_2")];

ref class Class1 {
public:
   void Test_Public() {
      Console::WriteLine("Class1::Test_Public");
   }
};

次のコード例では、プライベートを入力してコンポーネントにアクセスします。

// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend

int main() {
   Class1 ^ a = gcnew Class1;
   a->Test_Public();
}

出力

Class1::Test_Public

次のコード例では、コンポーネントを定義しますが、コンポーネントの型にアクセスできるクライアント アセンブリを指定しません。

コンポーネントが /opt:norefを使用してリンクことに注意してください。InternalsVisibleTo 時の属性が必要ないこれは、プライベート型がコンポーネントのメタデータに表示されることを確認します。詳細については、「/OPT (最適化)」を参照してください。

// friend_assemblies_3.cpp
// compile by using: /clr /LD /link /opt:noref
using namespace System;

ref class Class1 {
public:
   void Test_Public() {
      Console::WriteLine("Class1::Test_Public");
   }
};

次のコード例では、がプライベートにアクセスするためのプライベート型にアクセスしないコンポーネントに入力するクライアントを定義します。ランタイムの動作では、例外をキャッチする場合は型です。ヘルパー関数をプライベートにアクセスするを行う必要があります。

// friend_assemblies_4.cpp
// compile by using: /clr
#using "friend_assemblies_3.dll" as_friend
using namespace System;

void Test() {
   Class1 ^ a = gcnew Class1;
}

int main() {
   // to catch this kind of exception, use a helper function
   try {
      Test();   
   }
   catch(MethodAccessException ^ e) {
      Console::WriteLine("caught an exception");
   }
}

出力

caught an exception

次のコード例では、コンポーネントの型にアクセスできるクライアント アセンブリを指定する厳密な名前のコンポーネントを作成する方法を示します。

// friend_assemblies_5.cpp
// compile by using: /clr /LD /link /keyfile:friend_assemblies.snk
using namespace System::Runtime::CompilerServices;
using namespace System;
// an assembly attribute, not bound to a type

[assembly:InternalsVisibleTo("friend_assemblies_6, PublicKey=00240000048000009400000006020000002400005253413100040000010001000bf45d77fd991f3bff0ef51af48a12d35699e04616f27ba561195a69ebd3449c345389dc9603d65be8cd1987bc7ea48bdda35ac7d57d3d82c666b7fc1a5b79836d139ef0ac8c4e715434211660f481612771a9f7059b9b742c3d8af00e01716ed4b872e6f1be0e94863eb5745224f0deaba5b137624d7049b6f2d87fba639fc5")];

private ref class Class1 {
public:
   void Test_Public() {
      Console::WriteLine("Class1::Test_Public");
   }
};

コンポーネントで公開キーを指定する必要があることに注意してください。ここでは、キー ペアを作成し、公開キーを取得するには、コマンド プロンプトで次のコマンドを順番に移動することをお勧めします:

sn -d friend_assemblies.snk

sn -k friend_assemblies.snk

sn -i friend_assemblies.snk friend_assemblies.snk

sn -pc friend_assemblies.snk key.publickey

sn -tp key.publickey

次のコード例では、プライベートの型を厳密な名前のコンポーネントにアクセスします。

// friend_assemblies_6.cpp
// compile by using: /clr /link /keyfile:friend_assemblies.snk
#using "friend_assemblies_5.dll" as_friend

int main() {
   Class1 ^ a = gcnew Class1;
   a->Test_Public();
}

出力

Class1::Test_Public

参照

概念

ランタイム プラットフォームのコンポーネントの拡張機能