#using ディレクティブ (C++/CLI)
/clr でコンパイルされたプログラムにメタデータをインポートします。
構文
#using
file [as_friend
]
パラメーター
ファイル
Microsoft 中間言語 (MSIL) .dll
、.exe
、.netmodule
、または .obj
ファイル。 たとえば、 にします。
#using <MyComponent.dll>
as_friend
file のすべての型にアクセスできることを指定します。 詳細は、フレンド アセンブリ (C++) を参照してください。
解説
file は、マネージド データとマネージド コンストラクト用にインポートする Microsoft Intermediate Language (MSIL) ファイルにできます。 DLL にアセンブリ マニフェストが含まれている場合、マニフェストで参照されている DLL はすべてインポートされます。 作成するアセンブリは、メタデータ内の file をアセンブリ参照として一覧表示します。
おそらく file にはアセンブリは含まれず (file はモジュール)、現在の (アセンブリ) アプリケーション内のモジュールからの型情報を使用する予定はないでしょう。 /ASSEMBLYMODULE を使用し、モジュールがアセンブリの一部であることを示せます。 その場合、アセンブリを参照するすべてのアプリケーションで、そのモジュール内の型を使用できます。
#using
を使用する代わりに、/FU コンパイラ オプションを使用することができます。
#using
に渡される .exe アセンブリは、.NET Visual Studio コンパイラ (たとえば Visual Basic または Visual C#) のいずれかを使用してコンパイルする必要があります。 /clr
でコンパイルされた .exe アセンブリからメタデータをインポートしようとすると、ファイルの読み込み例外が発生します。
Note
#using
で参照されるコンポーネントは、コンパイル時にインポートされる別バージョンのファイルで実行することもできるため、クライアント アプリケーションで予期しない結果になります。
コンパイラで (モジュールではなく) アセンブリの型を認識するには、型を強制的に解決する必要があります。 たとえば、型のインスタンスを定義することで強制できます。 コンパイラのアセンブリの型名を解決するために、他の方法を使用できます。 たとえば、アセンブリの型から継承する場合、型名はコンパイラに認識されるようになります。
__declspec(thread)
を使用したソース コードでビルドしたメタデータをインポートする場合、スレッドのセマンティクスはメタデータでは保持されません。 たとえば、__declspec(thread)
で宣言された変数は、.NET Framework 共通言語ランタイム用にビルドされ、#using
を使用してインポートされたプログラムでコンパイルされ、変数に __declspec(thread)
セマンティクスが含まれません。
#using
によって参照されるファイル内のインポートされるすべての型 (マネージドとネイティブの両方) を使用できますが、コンパイラはネイティブ型を定義ではなく宣言として扱います。
/clr
でコンパイルするときには、mscorlib.dll が自動的に参照されます。
LIBPATH 環境変数は、コンパイラが #using
に渡されたファイル名を解決するときに検索するディレクトリを指定します。
コンパイラは、次のパスに従って参照を検索します。
#using
ステートメントで指定されたパス。現在のフォルダー。
.NET Framework のシステム ディレクトリ。
/AI
コンパイラ オプションで追加されたディレクトリ。LIBPATH 環境変数のディレクトリ。
例
3 つ目のアセンブリを参照する 2 つ目のアセンブリを参照するアセンブリを構築できます。 最初のアセンブリから 3 番目のアセンブリを明示的に参照する必要があるのは、その型の 1 つを明示的に使用する場合のみです。
ソース ファイル using_assembly_A.cpp
:
// using_assembly_A.cpp
// compile with: /clr /LD
public ref class A {};
ソース ファイル using_assembly_B.cpp
:
// using_assembly_B.cpp
// compile with: /clr /LD
#using "using_assembly_A.dll"
public ref class B {
public:
void Test(A a) {}
void Test() {}
};
次の例では、using_assembly_A.cppで定義されている型がプログラムで使用されないため、コンパイラはusing_assembly_A.dllの参照に関するエラーを報告しません。
// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
B b;
b.Test();
}