。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
將會針對非System
例外狀況叫用對應的 try
區塊。 不過,根據預設,會 CLR 使用 包裝非System
例外狀況 RuntimeWrappedException。 從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