Vanaf Visual Studio 2019 kunnen C++/CLI-projecten zich richten op .NET. Met deze ondersteuning kunt u Windows-bureaubladtoepassingen overzetten met C++/CLI-interoplagen van .NET Framework naar .NET. In dit artikel wordt beschreven hoe u C++/CLI-projecten van .NET Framework naar .NET kunt overzetten.
C++/CLI .NET Core-beperkingen
Er zijn enkele belangrijke beperkingen met C++/CLI-projecten en .NET vergeleken met .NET Framework:
Het compileren van een C++/CLI-project naar een uitvoerbaar bestand wordt niet ondersteund. U moet compileren naar een DLL.
C++/CLI-ondersteuning voor .NET is alleen Windows.
C++/CLI-projecten kunnen zich niet richten op .NET Standard.
C++/CLI-projecten bieden geen ondersteuning voor de nieuwere sdk-bestandsindeling van het project. In plaats daarvan gebruiken C++/CLI-projecten dezelfde .vcxproj bestandsindeling die andere Visual Studio C++-projecten gebruiken.
C++/CLI-projecten kunnen niet worden gericht op meerdere .NET-platforms. Als u een C++/CLI-project moet bouwen voor zowel .NET als .NET Framework, gebruikt u afzonderlijke projectbestanden.
.NET biedt geen ondersteuning -clr:pure voor of -clr:safe compilatie, alleen de nieuwere -clr:netcore optie (die gelijk is aan -clr voor .NET Framework).
Poort van een C++/CLI-project
Als u een C++/CLI-project wilt overzetten naar .NET, moet u de volgende wijzigingen aanbrengen in het bestand .vcxproj . Deze migratiestappen verschillen van de stappen die nodig zijn voor andere projecttypen, omdat C++/CLI-projecten geen SDK-projectbestanden gebruiken.
Eigenschappen vervangen <CLRSupport>true</CLRSupport> door <CLRSupport>NetCore</CLRSupport>. Deze eigenschap bevindt zich vaak in configuratiespecifieke eigenschapsgroepen, dus mogelijk moet u deze op meerdere plaatsen vervangen.
Eigenschappen vervangen <TargetFrameworkVersion> door <TargetFramework>net8.0</TargetFramework>. Zorg ervoor dat u de tag en waarde wijzigt.
Verwijder eventuele .NET Framework-verwijzingen naar System, System.Data, System.Windows.Formsen System.Xml, zoals <Reference Include="System" />. Er wordt automatisch naar .NET SDK-assembly's verwezen wanneer u deze gebruikt <CLRSupport>NetCore</CLRSupport>.
Werk het API-gebruik in .cpp bestanden zo nodig bij om API's te verwijderen die niet beschikbaar zijn voor .NET. Omdat C++/CLI-projecten meestal vrij dunne interoplagen zijn, zijn er vaak niet veel wijzigingen nodig. U kunt .NET Portability Analyzer gebruiken om niet-ondersteunde .NET-API's te identificeren die worden gebruikt door binaire C++/CLI-bestanden.
Als uw project een uitvoerbaar bestand was, voert u de volgende stappen uit:
Wijzig het projecttype in een bibliotheek.
Maak een nieuw uitvoerbaar .NET-project.
Voeg in het uitvoerbare .NET-project referentie toe aan de C++/CLI .NET-bibliotheek.
WPF- en Windows Forms-gebruik
.NET C++/CLI-projecten kunnen Windows Forms en WPF-API's gebruiken. Als u deze Windows-bureaublad-API's wilt gebruiken, moet u expliciete frameworkverwijzingen toevoegen aan de UI-bibliotheken. Sdk-projecten die gebruikmaken van Windows-bureaublad-API's verwijzen automatisch naar de benodigde frameworkbibliotheken met behulp van de Microsoft.NET.Sdk.WindowsDesktop SDK. Omdat C++/CLI-projecten niet de indeling van het SDK-project gebruiken, moeten ze expliciete frameworkverwijzingen toevoegen wanneer ze zich richten op .NET Core.
Als u Windows Forms-API's wilt gebruiken, voegt u deze verwijzing toe aan het .vcxproj-bestand :
<!-- Reference all of Windows Forms -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
Als u WPF-API's wilt gebruiken, voegt u deze verwijzing toe aan het .vcxproj-bestand :
<!-- Reference all of WPF -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" />
Als u zowel Windows Forms- als WPF-API's wilt gebruiken, voegt u deze verwijzing toe aan het .vcxproj-bestand :
<!-- Reference the entirety of the Windows desktop framework:
Windows Forms, WPF, and the types that provide integration between them -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
Momenteel is het niet mogelijk om deze verwijzingen toe te voegen met behulp van visual studio's referentiebeheer. Werk in plaats daarvan het projectbestand bij door het handmatig te bewerken. In Visual Studio moet u het project eerst verwijderen. U kunt ook een andere editor gebruiken, zoals Visual Studio Code.
Bouwen zonder MSBuild
Het is ook mogelijk om C++/CLI-projecten te bouwen zonder MSBuild te gebruiken. Volg deze stappen om een C++/CLI-project voor .NET Core rechtstreeks te bouwen met cl.exe en link.exe:
Geef bij het compileren -clr:netcore door aan cl.exe.
Verwijs naar de benodigde .NET-referentieassembly's.
Geef bij het koppelen de hostmap van de .NET-app op als een LibPath, zodat ijwhost.lib kan worden gevonden.
Kopieer ijwhost.dll uit de hostmap van de .NET-app naar de uitvoermap van het project.
Zorg ervoor dat er een runtimeconfig.json bestand bestaat voor het eerste onderdeel van de toepassing waarop beheerde code wordt uitgevoerd. Voor de nieuwste versies van Visual Studio wordt een runtime.config-bestand gemaakt en automatisch gekopieerd.
Voor oudere versies van Visual Studio moet u, als de toepassing een systeemeigen toegangspunt heeft, handmatig het volgende runtimeconfig.json-bestand maken voor de eerste C++/CLI-bibliotheek om de .NET-runtime te kunnen gebruiken. Als een C++/CLI-bibliotheek wordt aangeroepen vanuit een beheerd toegangspunt, heeft de bibliotheek geen runtimeconfig.json bestand nodig, omdat de assembly van het toegangspunt een bibliotheek heeft die wordt gebruikt bij het starten van de runtime.
C++/CLI-assembly's die gericht zijn op .NET 7 of een latere versie, worden altijd in de standaardversie AssemblyLoadContextgeladen. In .NET 6 en eerdere versies kunnen C++/CLI-assembly's echter meerdere keren worden geladen, telkens in een nieuwe AssemblyLoadContext. Als de eerste keer dat beheerde code in een C++/CLI-assembly wordt uitgevoerd:
Is afkomstig van een systeemeigen aanroeper, de assembly wordt in een afzonderlijk AssemblyLoadContextbestand geladen.
Is afkomstig van een beheerde aanroeper, de assembly wordt geladen in hetzelfde AssemblyLoadContext als de aanroeper, meestal de standaardinstelling.
Als u uw C++/CLI-assembly altijd in de standaardinstelling AssemblyLoadContextwilt laden, kunt u een aanroep 'initialiseren' vanuit uw invoerpuntassembly toevoegen aan uw C++/CLI-assembly. Zie dit probleem met dotnet/runtime voor meer informatie.
Met ons samenwerken op GitHub
De bron voor deze inhoud vindt u op GitHub, waar u ook problemen en pull-aanvragen kunt maken en controleren. Bekijk onze gids voor inzenders voor meer informatie.
.NET-feedback
.NET is een open source project. Selecteer een koppeling om feedback te geven:
.NET is een gratis, platformoverschrijdend, opensource-ontwikkelaarsplatform voor het ontwikkelen van veel verschillende soorten toepassingen. Met .NET kunt u meerdere talen, editors en bibliotheken gebruiken om te bouwen voor web, mobiel, desktop, games en IoT.