Share via


.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

Baca juga