共用方式為


.netmodule 作為連結器輸入的檔案

link.exe 接受 MSIL .obj.netmodule 檔案做為輸入。 連結器所產生的輸出檔案是元件或 .netmodule 檔案,與輸入連結器的任何 .obj.netmodule 檔案沒有任何執行時間相依性。

備註

.netmodule 檔案是由 MSVC 編譯器使用 /LN (建立 MSIL 模組) 或連結器使用 /NOASSEMBLY 建立的 (建立 MSIL 模組) 所建立。 .obj 檔案一律會在 C++ 編譯中建立。 如需其他 Visual Studio 編譯器,請使用 /target:module 編譯器選項。

連結器必須從建立 的 .netmodule C++ 編譯傳遞 .obj 檔案。 .netmodule不再支援傳入 ,因為 Visual Studio 2015 中已淘汰 / clr : pure 和 / clr : safe 編譯器選項,而且 Visual Studio 2017 和更新版本中不支援。

如需如何從命令列叫用連結器的資訊,請參閱 從命令列 叫用連結器命令列語法 和使用 MSVC 工具組。

使用 .netmodule / clr 將 或 .dll 檔案傳遞至 MSVC 編譯 程式所編譯的連結器,可能會導致連結器錯誤。 如需詳細資訊,請參閱 選擇 的格式 netmodule

連結器同時接受以 / clr 編譯的原生 .obj 檔案和 MSIL .obj 檔案。 您可以在相同的組建中傳遞混合 .obj 檔案。 產生的輸出檔案預設可驗證性與最低輸入模組的可驗證性相同。

您可以變更由兩個或多個元件組成的應用程式,以包含在一個元件中。 重新編譯元件的來源,然後連結 .obj 檔案或 .netmodule 檔案以產生單一元件。

建立可執行映射時,使用 /ENTRY(進入點符號) 指定進入點。

當與 MSIL .obj.netmodule 檔案連結時,請使用 /LTCG (連結時間程式碼產生), 否則當連結器遇到 MSIL .obj.netmodule 時,它會使用 /LTCG 重新開機連結。 您會看到一則資訊訊息,指出連結正在重新開機。 您可以忽略此訊息,但若要改善連結器效能,請明確指定 /LTCG

MSIL .obj.netmodule 檔案也可以傳遞至 cl.exe。

輸入 MSIL .obj.netmodule 檔案不能有內嵌的資源。 使用 /ASSEMBLYRESOURCE (內嵌 Managed 資源) 連結器選項, 在輸出模組或元件檔中內嵌資源。 或者,在其他 Visual Studio 編譯器中使用 /resource 編譯器選項。

範例

在 C++ 程式碼中 catch ,對應的 區塊 try 將會針對非 System 例外狀況叫用。 不過,根據預設,CLR 會以 RuntimeWrappedException 包裝非 System 例外狀況。 從 C++ 和非 C++ 模組建立元件時,您希望 catch C++ 程式碼中的區塊在區塊擲回非 System 例外狀況時 try ,從其對應的 try 子句叫用區塊,您必須將 屬性新增 [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] 至非 C++ 模組的原始程式碼。

// 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();
}
*/

藉由變更 Boolean 屬性的值 WrapNonExceptionThrows ,您可以修改 C++ 程式碼攔截非 System 例外狀況的能力。

// 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

另請參閱