.netmodule bestanden als linkerinvoer
link.exe accepteert MSIL-.obj
- en .netmodule
-bestanden als invoer. Het uitvoerbestand dat door de linker wordt geproduceerd, is een assembly- of .netmodule
-bestand zonder runtime-afhankelijkheid van een van de .obj
- of .netmodule
-bestanden die zijn ingevoerd voor de linker.
Opmerkingen
.netmodule
bestanden worden gemaakt door de MSVC-compiler met /LN (MSIL-module maken) of door de linker met /NOASSEMBLY (Een MSIL-module maken).
.obj
bestanden worden altijd gemaakt in een C++-compilatie. Gebruik voor andere Visual Studio-compilers de optie /target:module compiler.
De linker moet het .obj
-bestand worden doorgegeven uit de C++-compilatie die de .netmodule
heeft gemaakt. Het doorgeven van een .netmodule
wordt niet meer ondersteund omdat de /clr:pure en /clr:safe compileropties zijn afgeschaft in Visual Studio 2015 en worden niet ondersteund in Visual Studio 2017 en hoger.
Zie opdrachtregelsyntaxis van linker en Gebruik de MSVC-toolset vanaf de opdrachtregelvoor meer informatie over het aanroepen van de linker-opdrachtregel.
Het doorgeven van een .netmodule
- of .dll
-bestand aan de linker die is gecompileerd door de MSVC-compiler met /clr kan leiden tot een linkerfout. Zie De indeling kiezen voor meer informatie.netmodule invoerbestanden.
De linker accepteert zowel systeemeigen .obj
bestanden als MSIL .obj
bestanden gecompileerd met /clr. U kunt gemengde .obj
bestanden doorgeven in dezelfde build. De standaard controleerbaarheid van het resulterende uitvoerbestand is hetzelfde als de betrouwbaarheid van de laagste invoermodule.
U kunt een toepassing wijzigen die bestaat uit twee of meer assembly's, zodat deze zich in één assembly bevinden. Compileer de bronnen van de assembly's opnieuw en koppel de .obj
bestanden of .netmodule
bestanden om één assembly te produceren.
Geef een toegangspunt op met behulp van /ENTRY -symbool (ingangspuntsymbool) bij het maken van een uitvoerbare installatiekopieën.
Wanneer u een koppeling maakt met een MSIL-.obj
- of .netmodule
-bestand, gebruikt u /LTCG (koppelingstijdcodegeneratie), anders wordt de koppeling met /LTCG-opnieuw gestart wanneer de linker de MSIL-.obj
of .netmodule
tegenkomt. U ziet een informatief bericht dat de koppeling opnieuw wordt gestart. U kunt dit bericht negeren, maar om de prestaties van de linker te verbeteren, geeft u expliciet /LTCG-op.
MSIL-.obj
- of .netmodule
-bestanden kunnen ook worden doorgegeven aan cl.exe.
Ingevoerde MSIL-.obj
- of .netmodule
-bestanden kunnen geen ingesloten resources bevatten. Resources insluiten in een uitvoermodule of assemblybestand met behulp van de optie /ASSEMBLYRESOURCE (Een beheerde resource insluiten) linkeroptie. Of gebruik de optie /resource compiler in andere Visual Studio-compilers.
Voorbeelden
In C++-code wordt het catch
blok van een overeenkomende try
aangeroepen voor een niet-System
uitzondering. Standaard verpakt de CLR echter niet-System
uitzonderingen met RuntimeWrappedException. Wanneer een assembly wordt gemaakt op basis van C++- en niet-C++-modules en u een catch
blok in C++-code wilt aanroepen vanuit de bijbehorende try
component wanneer het try
blok een niet-System
uitzondering genereert, moet u het kenmerk [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
toevoegen aan de broncode voor de niet-C++-modules.
// 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();
}
*/
Door de Boolean
waarde van het kenmerk WrapNonExceptionThrows
te wijzigen, wijzigt u de mogelijkheid van de C++-code om een niet-System
uitzondering te ondervangen.
// 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