Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de Visual Studio 2019, les projets C++/CLI peuvent cibler .NET. Cette prise en charge permet de porter des applications de bureau Windows avec des couches d’interopérabilité C++/CLI de .NET Framework vers .NET. Cet article explique comment porter des projets C++/CLI de .NET Framework vers .NET.
Limitations de C++/CLI .NET Core
Il existe certaines limitations importantes avec les projets C++/CLI et .NET par rapport à .NET Framework :
- La compilation d’un projet C++/CLI sur un exécutable n’est pas prise en charge. Vous devez compiler dans une DLL.
- La prise en charge de C++/CLI pour .NET est uniquement disponible sous Windows.
- Les projets C++/CLI ne peuvent pas cibler .NET Standard.
- Les projets C++/CLI ne prennent pas en charge le nouveau format de fichier de projet de style SDK. Au lieu de cela, les projets C++/CLI utilisent le même format de fichier .vcxproj que les autres projets Visual Studio C++utilisent.
- Les projets C++/CLI ne peuvent pas cibler plusieurs plateformes .NET. Si vous devez générer un projet C++/CLI pour .NET et .NET Framework, utilisez des fichiers projet distincts.
- .NET ne prend pas en charge la compilation
-clr:pure
ou-clr:safe
, seule l'option plus récente-clr:netcore
(qui équivaut à-clr
pour le .NET Framework).
Porter un projet C++/CLI
Pour porter un projet C++/CLI vers .NET, apportez les modifications suivantes au fichier .vcxproj . Ces étapes de migration diffèrent des étapes nécessaires pour d’autres types de projets, car les projets C++/CLI n’utilisent pas de fichiers projet de style SDK.
- Remplacez les propriétés
<CLRSupport>true</CLRSupport>
par<CLRSupport>NetCore</CLRSupport>
. Cette propriété se trouve souvent dans des groupes de propriétés spécifiques à la configuration. Vous devrez peut-être le remplacer à plusieurs emplacements. - Remplacez les propriétés
<TargetFrameworkVersion>
par<TargetFramework>net8.0</TargetFramework>
. Veillez à modifier la balise et la valeur. - Supprimez toutes les références .NET Framework à
System
,System.Data
,System.Windows.Forms
etSystem.Xml
, comme<Reference Include="System" />
. Les assemblys du Kit de développement logiciel (SDK) .NET sont automatiquement référencés lors de l’utilisation<CLRSupport>NetCore</CLRSupport>
. - Mettez à jour l’utilisation de l’API dans les fichiers .cpp , si nécessaire, pour supprimer les API indisponibles dans .NET. Étant donné que les projets C++/CLI ont tendance à être des couches d’interopérabilité assez minces, il n’y a souvent pas beaucoup de changements nécessaires. Vous pouvez utiliser .NET Portability Analyzer pour identifier les API .NET non prises en charge utilisées par les fichiers binaires C++/CLI.
- Si votre projet était un exécutable, procédez comme suit :
- Remplacez le type de projet par une bibliothèque.
- Créez un projet exécutable .NET.
- Dans le projet exécutable .NET, ajoutez la référence à la bibliothèque .NET C++/CLI.
Utilisation de WPF et windows Forms
Les projets .NET C++/CLI peuvent utiliser les API Windows Forms et WPF. Pour utiliser ces API de bureau Windows, vous devez ajouter des références d’infrastructure explicites aux bibliothèques d’interface utilisateur. Les projets de style SDK qui utilisent les API de bureau Windows référencent automatiquement les bibliothèques d’infrastructure nécessaires à l’aide du Microsoft.NET.Sdk.WindowsDesktop
Kit de développement logiciel (SDK). Étant donné que les projets C++/CLI n’utilisent pas le format de projet de style SDK, ils doivent ajouter des références d’infrastructure explicites lors du ciblage de .NET Core.
Pour utiliser les API Windows Forms, ajoutez cette référence au fichier .vcxproj :
<!-- Reference all of Windows Forms -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
Pour utiliser les API WPF, ajoutez cette référence au fichier .vcxproj :
<!-- Reference all of WPF -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" />
Pour utiliser les API Windows Forms et WPF, ajoutez cette référence au fichier .vcxproj :
<!-- Reference the entirety of the Windows desktop framework:
Windows Forms, WPF, and the types that provide integration between them -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
Actuellement, il n’est pas possible d’ajouter ces références à l’aide du gestionnaire de références de Visual Studio. Au lieu de cela, mettez à jour le fichier projet en le modifiant manuellement. Dans Visual Studio, vous devez d’abord décharger le projet. Vous pouvez également utiliser un autre éditeur comme Visual Studio Code.
Générer sans MSBuild
Il est également possible de générer des projets C++/CLI sans utiliser MSBuild. Procédez comme suit pour générer un projet C++/CLI pour .NET Core directement avec cl.exe et link.exe:
Lors de la compilation, passez
-clr:netcore
à cl.exe.Référencez les assemblys de référence .NET nécessaires.
Lors de la liaison, fournissez le répertoire hôte de l’application .NET en tant que
LibPath
, afin que ijwhost.lib soit trouvé.Copiez ijwhost.dll du répertoire hôte de l’application .NET vers le répertoire de sortie du projet.
Vérifiez qu’un fichier runtimeconfig.json existe pour le premier composant de l’application qui exécute du code managé. Pour les dernières versions de Visual Studio, un fichier runtime.config est créé et copié automatiquement.
Pour les versions antérieures de Visual Studio, si l’application a un point d’entrée natif, vous devez créer manuellement le fichier runtimeconfig.json suivant pour la première bibliothèque C++/CLI pour utiliser le runtime .NET. Si une bibliothèque C++/CLI est appelée à partir d’un point d’entrée managé, la bibliothèque n’a pas besoin d’un fichier runtimeconfig.json , car l’assembly de point d’entrée a un assembly utilisé lors du démarrage du runtime.
{ "runtimeOptions": { "tfm": "net8.0", "framework": { "name": "Microsoft.NETCore.App", "version": "8.0.0" } } }
Remarque
Les assemblys C++/CLI qui ciblent .NET 7 ou une version ultérieure sont toujours chargés dans la valeur par défaut AssemblyLoadContext. Toutefois, dans .NET 6 et versions antérieures, les assemblys C++/CLI peuvent être chargés plusieurs fois, chaque fois dans un nouveau AssemblyLoadContext
. Si la première fois que le code managé dans un assembly C++/CLI est exécuté :
- Provient d’un appelant natif, l’assembly est chargé dans un
AssemblyLoadContext
distinct. - Provient d’un appelant géré, l’assembly est chargé dans le même
AssemblyLoadContext
que l’appelant, généralement la valeur par défaut.
Pour toujours charger votre assembly C++/CLI dans le AssemblyLoadContext
par défaut, vous pouvez ajouter un appel de style « initialiser » depuis votre assembly de point d’entrée à votre assembly C++/CLI. Pour plus d’informations, consultez ce problème lié à dotnet/au runtime.