.netmodule fichiers en tant qu’entrée de l’éditeur de liens
link.exe accepte MSIL .obj
et .netmodule
les fichiers comme entrée. Le fichier de sortie produit par l’éditeur de liens est un assembly ou un .netmodule
fichier sans dépendance au moment de l’exécution sur les .obj
fichiers ou .netmodule
les fichiers qui ont été entrés dans l’éditeur de liens.
Notes
.netmodule
les fichiers sont créés par le compilateur MSVC avec /LN (Créer un module MSIL) ou par l’éditeur de liens avec /NOASSEMBLY (Créer un module MSIL). .obj
les fichiers sont toujours créés dans une compilation C++. Pour d’autres compilateurs Visual Studio, utilisez l’option de compilateur/target:module.
L’éditeur de liens doit être passé le .obj
fichier à partir de la compilation C++ qui a créé le .netmodule
. La transmission d’un fichier .netmodule
n’est plus prise en charge, car les options /clr :pure et /clr :safe du compilateur sont déconseillées dans Visual Studio 2015 et non prises en charge dans Visual Studio 2017 et versions ultérieures.
Pour plus d’informations sur l’appel de l’éditeur de liens à partir de la ligne de commande, consultez la syntaxe de ligne de commande Éditeur de liens et utilisez l’ensemble d’outils MSVC à partir de la ligne de commande.
Le passage d’un ou .dll
d’un .netmodule
fichier à l’éditeur de liens compilé par le compilateur MSVC avec /clr peut entraîner une erreur d’éditeur de liens. Pour plus d’informations, consultez Choisir le format des fichiers d’entrée.netmodule
L’éditeur de liens accepte les fichiers natifs .obj
et les fichiers MSIL .obj
compilés avec /clr. Vous pouvez transmettre des fichiers mixtes .obj
dans la même build. La verifiabilité par défaut du fichier de sortie résultante est identique à la verifiabilité du module d’entrée le plus bas.
Vous pouvez modifier une application composée de deux assemblys ou plus à contenir dans un assembly. Recompilez les sources des assemblys, puis liez les .obj
fichiers ou .netmodule
fichiers pour produire un seul assembly.
Spécifiez un point d’entrée à l’aide de /ENTRY (symbole de point d’entrée) lors de la création d’une image exécutable.
Lors de la liaison avec un fichier OU MSIL.obj
, utilisez /LTCG (génération de code au moment du lien) ; sinon, lorsque l’éditeur de liens rencontre msIL .obj
ou .netmodule
, il redémarre le lien avec /LTCG..netmodule
Vous verrez un message d’information indiquant que le lien redémarre. Vous pouvez ignorer ce message, mais pour améliorer les performances de l’éditeur de liens, spécifiez explicitement /LTCG.
MSIL .obj
ou .netmodule
les fichiers peuvent également être passés à cl.exe.
MsIL .obj
d’entrée ou .netmodule
les fichiers ne peuvent pas avoir de ressources incorporées. Incorporer des ressources dans un module de sortie ou un fichier d’assembly à l’aide de l’option de l’éditeur de liens /ASSEMBLYRESOURCE (Incorporer une ressource managée). Vous pouvez également utiliser l’option /resource compiler dans d’autres compilateurs Visual Studio.
Exemples
Dans le code C++, le catch
bloc d’un correspondant try
est appelé pour une exception non-exceptionSystem
. Toutefois, par défaut, l’encapsule CLR les exceptions non-exceptionsSystem
avec RuntimeWrappedException. Lorsqu’un assembly est créé à partir de modules C++ et non-C++, et que vous souhaitez qu’un catch
bloc dans le code C++ soit appelé à partir de sa clause correspondante try
lorsque le try
bloc lève une exception non-System
, vous devez ajouter l’attribut [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
au code source pour les modules 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();
}
*/
En modifiant la Boolean
valeur de l’attribut WrapNonExceptionThrows
, vous modifiez la capacité du code C++ à intercepter une exception nonSystem
- .
// 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