.netmodule file sebagai input linker
link.exe menerima MSIL .obj
dan .netmodule
file sebagai input. File output yang dihasilkan oleh linker adalah rakitan atau .netmodule
file tanpa dependensi run-time pada salah .obj
satu file atau .netmodule
yang dimasukkan ke linker.
Keterangan
.netmodule
file dibuat oleh pengkompilasi MSVC dengan /LN (Buat modul MSIL) atau oleh linker dengan /NOASSEMBLY (Buat Modul MSIL). .obj
file selalu dibuat dalam kompilasi C++. Untuk pengkompilasi Visual Studio lainnya, gunakan opsi pengkompilasi /target:module .
Linker harus diteruskan .obj
file dari kompilasi C++ yang membuat .netmodule
. Meneruskan .netmodule
tidak lagi didukung karena opsi kompilator /clr:pure dan /clr:safe tidak digunakan lagi di Visual Studio 2015 dan tidak didukung di Visual Studio 2017 dan yang lebih baru.
Untuk informasi tentang cara memanggil linker dari baris perintah, lihat Sintaks baris perintah linker dan Menggunakan toolset MSVC dari baris perintah.
Meneruskan .netmodule
file atau .dll
ke linker yang dikompilasi oleh pengkompilasi MSVC dengan /clr dapat mengakibatkan kesalahan linker. Untuk informasi selengkapnya, lihat Memilih format file input .netmodule
Linker menerima file asli .obj
dan file MSIL .obj
yang dikompilasi dengan /clr. Anda dapat meneruskan .obj
file campuran dalam build yang sama. Verifiability default file output yang dihasilkan sama dengan verifiability modul input terendah.
Anda dapat mengubah aplikasi yang terdiri dari dua atau beberapa rakitan untuk dimuat dalam satu rakitan. Kompilasi ulang sumber rakitan, lalu tautkan .obj
file atau .netmodule
file untuk menghasilkan satu rakitan.
Tentukan titik masuk menggunakan /ENTRY (Simbol titik entri) saat membuat gambar yang dapat dieksekusi.
Saat menautkan dengan MSIL .obj
atau .netmodule
file, gunakan /LTCG (Pembuatan kode waktu tautan), jika tidak ketika linker menemukan MSIL .obj
atau .netmodule
, itu akan menghidupkan ulang tautan dengan /LTCG. Anda akan melihat pesan informasi bahwa tautan sedang dimulai ulang. Anda dapat mengabaikan pesan ini, tetapi untuk meningkatkan performa linker, tentukan /LTCG secara eksplisit.
MSIL .obj
atau .netmodule
file juga dapat diteruskan ke cl.exe.
Input MSIL .obj
atau .netmodule
file tidak dapat memiliki sumber daya yang disematkan. Sematkan sumber daya dalam modul output atau file rakitan dengan menggunakan opsi tautan /ASSEMBLYRESOURCE (Sematkan sumber daya terkelola). Atau, gunakan opsi /resource compiler di pengkompilasi Visual Studio lainnya.
Contoh
Dalam kode C++, catch
blok yang sesuai try
akan dipanggil untuk non-pengecualianSystem
. Namun, secara default, CLR membungkus non-pengecualianSystem
dengan RuntimeWrappedException. Ketika rakitan dibuat dari modul C++ dan non-C++, dan Anda ingin catch
blok dalam kode C++ dipanggil dari klausul yang sesuai try
ketika try
blok melemparkan non-pengecualianSystem
, Anda harus menambahkan [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
atribut ke kode sumber untuk modul non-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();
}
*/
Dengan mengubah Boolean
nilai WrapNonExceptionThrows
atribut, Anda memodifikasi kemampuan kode C++ untuk menangkap non-pengecualianSystem
.
// 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