Delen via


.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 .netmoduleheeft 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 .netmoduletegenkomt. 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

Zie ook