Share via


リンカー入力としての .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#");
      }
   }
}
  

参照

関連項目

LINK の入力ファイル

リンカー オプション