リンカー入力としての .netmodule ファイル
link.exe は、入力として、MSIL .obj、.netmodules を受け取ります。 リンカーによって生成される出力ファイルはリンカーに渡された .netmodules または .obj のランタイム依存関係を持たないアセンブリまたは"です。
.netmodules は /NOASSEMBLY (MSIL モジュールの作成)と Visual C++ コンパイラやリンカーによって /LN (MSIL モジュールの作成) で作成されます。.obj は、Visual C++ コンパイルで常に作成されます。 他の Visual Studio コンパイラでは、/target:module コンパイラ オプションを使用します。
ほとんどの場合 /clr (共通言語ランタイムのコンパイル)と"が作成されていない場合は、リンカーに"を作成した Visual C++ コンパイラから .obj ファイルを渡す必要があります。 リンカーへの入力として使用される MSIL .netmodules は /clr:safeを使用する Visual C++ コンパイラで生成できる純粋 MSIL である必要があります。 他の Visual Studio コンパイラでは、既定で純粋 MSIL モジュールが作成されます。
コマンド ラインからリンカーを呼び出す方法については、「リンカー コマンド ラインの構文」および「コマンド ライン ビルドのパスと環境変数の設定」を参照してください。
.netmodule または .dll では /clr の Visual C++ コンパイラでコンパイルされたか、リンカーのエラーが発生すると /clr:pure リンカーに追加できます。 詳細については、「.netmodule 入力ファイルの形式の選択」を参照してください。
リンカーは、/clr、/clr:pure、または /clr:safe を指定してコンパイルされた MSIL .obj ファイルだけでなくネイティブ .obj ファイルも受け入れます。 同じビルドに混在する .obj を渡すと、生成される出力ファイルの検証可能性は、既定で入力モジュールの最低レベルの検証可能性と等しくなります。 たとえば、安全で純粋な .obj をリンカーに渡した場合は、出力ファイルは純粋になります。 /CLRIMAGETYPE (CLR イメージのタイプの指定) では、必要に応じてより低いレベルの検証可能性を指定できます。
現在、二つ以上のアセンブリで構成されるアプリケーションが 1 台のアセンブリに格納する場合は、すべてのアセンブリを再コンパイルし、一つのアセンブリを生成するために .netmodules をリンクする必要があります。
実行可能なイメージを作成する場合は、/ENTRY (エントリ ポイント シンボル) を使用してエントリ ポイントを指定する必要があります。
操作 /LTCG (リンク時のコード生成)MSIL .obj または .netmodule ファイルとリンクすると、それはリンカー MSIL .obj または .netmodule が見つかった場合、/LTCG のリンクを再起動します。
MSIL .obj または .netmodule ファイルを cl.exe に渡すことができます。
入力 MSIL .obj または .netmodule ファイルは、埋め込みリソースを保持できません。 リソースは、出力ファイル (モジュールまたはアセンブリ) に、/ASSEMBLYRESOURCE (マネージ リソースの埋め込み) リンカー オプションで、また他の Visual Studio コンパイラでは /resource コンパイル オプションで埋め込まれます。
MSIL リンクを実行するときに、/LTCG (リンク時のコード生成) も指定しない場合は、リンクの再起動を報告する情報メッセージが表示されます。 このメッセージは無視できますが、MSIL リンクでのリンカーのパフォーマンスを向上させるには、明示的に /LTCG を指定します。
使用例
C++ コードでは、try に対応する catch ブロックは、システム例外以外の例外に対して呼び出されます。 ただし、既定では、CLR が RuntimeWrappedException でシステム例外以外の例外をラップします。 アセンブリが Visual C++ のモジュールおよび Visual C++ 以外のモジュールから作成されている場合、try ブロックがシステム例外以外の例外をスローするときに、対応する C++ コードの catch ブロックを呼び出すようにするには、C++ 以外のモジュールのソース コードに
[assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] 属性を追加する必要があります。
// MSIL_linking.cpp
// compile with: /c /clr
value struct V {};
ref struct MCPP {
static void Test() {
try {
throw (gcnew V);
}
catch (V ^) {
System::Console::WriteLine("caught non System exception in C++ source code file");
}
}
};
/*
int main() {
MCPP::Test();
}
*/
WrapNonExceptionThrows 属性の Boolean 値を変更して、システム例外以外の例外をキャッチするように、Visual C++ コードの機能を変更します。
// MSIL_linking_2.cs
// compile with: /target:module /addmodule:MSIL_linking.obj
// post-build command: link /LTCG MSIL_linking.obj MSIL_linking_2.netmodule /entry:MLinkTest.Main /out:MSIL_linking_2.exe /subsystem:console
using System.Runtime.CompilerServices;
// enable non System exceptions
[assembly:RuntimeCompatibility(WrapNonExceptionThrows=false)]
class MLinkTest {
public static void Main() {
try {
MCPP.Test();
}
catch (RuntimeWrappedException) {
System.Console.WriteLine("caught a wrapped exception in C#");
}
}
}