リンカ入力としての .netmodule ファイル

更新 : 2007 年 11 月

link.exe は、入力として MSIL の .obj および .netmodule を受け入れるようになりました。リンカによって作成される出力ファイルは、アセンブリまたは .netmodule になります。リンカへの入力となった .obj または .netmodule に対する実行時の依存関係はありません。

.netmodule は、/LN (MSIL モジュールの作成) を指定した Visual C++ コンパイラ、または /NOASSEMBLY (MSIL モジュールの作成) を指定したリンカによって作成されます。.obj は、Visual C++ コンパイルで常に作成されます。他の Visual Studio コンパイラでは、/target:module コンパイラ オプションを使用します。

ほとんどの場合、リンカに、.netmodule を作成した Visual C++ コンパイラから .obj ファイルを渡す必要があります。ただし、.netmodule が /clr (共通言語ランタイムのコンパイル) を指定して作成された場合は除きます。リンカへの入力として使用される MSIL .netmodule は、純粋 MSIL である必要があります。これは、Visual C++ コンパイラでは /clr:safe を指定して作成できます。他の Visual Studio コンパイラでは、既定で純粋 MSIL モジュールが作成されます。

コマンド ラインからリンカを呼び出す方法については、「リンカ コマンド ラインの構文」および「コマンド ライン ビルドのパスと環境変数の設定」を参照してください。

Visual C++ コンパイラで /clr または /clr:pure を指定してコンパイルされた .netmodule ファイルまたは .dll ファイルをリンカに渡すと、リンカ エラーが発生することがあります。詳細については、「.netmodule 入力ファイルの形式の選択」を参照してください。

リンカは、/clr/clr:pure、または /clr:safe を指定してコンパイルされた MSIL .obj ファイルだけでなくネイティブ .obj ファイルも受け入れます。同じビルドに混在する .obj を渡すと、生成される出力ファイルの検証可能性は、既定で入力モジュールの最低レベルの検証可能性と等しくなります。たとえば、安全で純粋な .obj をリンカに渡した場合は、出力ファイルは純粋になります。/CLRIMAGETYPE (CLR イメージのタイプの指定) では、必要に応じてより低いレベルの検証可能性を指定できます。

現在、2 つ以上のアセンブリで構成されるアプリケーションがあり、それを 1 つのアセンブリに格納する場合は、アセンブリを再コンパイルし、.obj または .netmodule をリンクして 1 つのアセンブリを作成する必要があります。

実行可能なイメージを作成する場合は、/ENTRY (エントリ ポイント シンボル) を使用してエントリ ポイントを指定する必要があります。

MSIL .obj ファイルまたは .netmodule ファイルとリンクする場合は、/LTCG (リンク時のコード生成) を使用します。これを使用しない場合、リンカは 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#");
      }
   }
}

caught non System exception in C++ source code file

参照

参照

LINK の入力ファイル

リンカ オプション