Remarque
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.
Cette rubrique vous guide tout au long du processus d’ajout d’un composant C# simple à votre projet C++/WinRT.
Visual Studio facilite la création et le déploiement de vos propres types de Windows Runtime personnalisés à l’intérieur d’un projet de composant Windows Runtime (WRC) écrit avec C# ou Visual Basic, puis de référencer ce WRC à partir d’un projet d’application C++ et d’utiliser ces types personnalisés à partir de cette application.
En interne, vos types de Windows Runtime peuvent utiliser n'importe quelle fonctionnalité .NET autorisée dans une application UWP.
Note
Pour plus d’informations, consultez Windows Runtime composants avec C# et Visual Basic et .NET pour la vue d’ensemble des applications UWP.
En externe, les membres de votre type peuvent exposer uniquement Windows Runtime types pour leurs paramètres et leurs valeurs de retour. Lorsque vous générez votre solution, Visual Studio génère votre projet WRC .NET, puis exécute une étape de génération qui crée un fichier de métadonnées Windows (.winmd). Il s’agit de votre composant Windows Runtime (WRC), qui Visual Studio inclus dans votre application.
Note
.NET mappe automatiquement certains types .NET couramment utilisés, tels que les types de données primitifs et les types de collection, à leurs équivalents Windows Runtime. Ces types .NET peuvent être utilisés dans l’interface publique d’un composant Windows Runtime et apparaissent aux utilisateurs du composant en tant que types de Windows Runtime correspondants. Consultez Composants Windows Runtime avec C# et Visual Basic.
Prerequisites
- Windows 10
- Microsoft Visual Studio
Créer une application vide
Dans Visual Studio, créez un projet à l’aide du modèle de projet Application vide (C++/WinRT) (pour les applications de bureau WinUI 3, utilisez le modèle Application vide, Empaqueté (WinUI 3 dans Desktop). Assurez-vous que vous utilisez le modèle (C++/WinRT), et non l'un (universal Windows).
Définissez le nom du nouveau projet sur CppToCSharpWinRT afin que votre structure de dossiers corresponde à la procédure pas à pas.
Ajouter un composant Windows Runtime C# à la solution
Dans Visual Studio, créez le composant project : dans Explorateur de solutions, ouvrez le menu contextuel de la solution CppToCSharpWinRT, puis choisissez Ajouter, puis choisissez Nouvelle Project pour ajouter une nouvelle project C# à la solution. Dans la section Modèles installés de la boîte de dialogue Ajouter une nouvelle Project, choisissez Visual C#, puis Windows, puis Universal. Choisissez le modèle Windows Runtime Component (universal Windows) et entrez SampleComponent pour le nom du projet.
Note
Dans la boîte de dialogue Nouveau plateforme Windows universelle Project, choisissez Windows 10 Creators Update (10.0 ; Build 15063) comme version minimale. Pour plus d’informations, consultez la section Version minimale de l’application ci-dessous.
Ajouter la méthode C# GetMyString
Dans le projet SampleComponent , remplacez le nom de la classe de Class1 par Example. Ajoutez ensuite deux membres simples à la classe, un champ privé int et une méthode d’instance nommée GetMyString :
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Note
Par défaut, la classe est marquée comme scellée publique. Toutes les classes Windows Runtime que vous exposez à partir de votre composant doivent être scellées.
Note
Facultatif : pour activer IntelliSense pour les membres nouvellement ajoutés, dans Explorateur de solutions, ouvrez le menu contextuel du projet SampleComponent, puis choisissez Générer.
Référencez le composant C# SampleComponent à partir du projet CppToCSharpWinRT
Dans Explorateur de solutions, dans le projet C++/WinRT, ouvrez le menu contextuel des références, puis choisissez Ajouter une référence pour ouvrir la boîte de dialogue Ajouter une référence. Choisissez Projets, puis choisissez Solution. Cochez la case pour le projet SampleComponent et choisissez OK pour ajouter une référence.
Note
Facultatif : pour activer IntelliSense pour le projet C++/WinRT, dans Explorateur de solutions, ouvrez le menu contextuel du projet CppToCSharpWinRT, puis choisissez Générer.
Modifier MainPage.h
Ouvrez MainPage.h le projet CppToCSharpWinRT , puis ajoutez deux éléments. Commencez par ajouter #include "winrt/SampleComponent.h" à la fin des #include instructions, puis un winrt::SampleComponent::Example champ au MainPage struct.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Note
Dans Visual Studio, MainPage.h est répertorié sous MainPage.xaml.
Modifier MainPage.cpp
Dans MainPage.cpp, modifiez l’implémentation Mainpage::ClickHandler pour appeler la méthode GetMyStringC#.
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
Exécuter le projet
Vous pouvez maintenant générer et exécuter le projet. Chaque fois que vous cliquez sur le bouton, le nombre dans le bouton est incrémenté.
Tip
Dans Visual Studio, créez le projet de composant : dans Explorateur de solutions, ouvrez le menu contextuel du projet CppToCSharpWinRT, puis choisissez Propriétés, puis choisissez Débogage sous Propriétés de configuration. Définissez le type de débogueur sur Managed and Native si vous souhaitez déboguer le code C# (managé) et C++ (natif).
Version minimale de l’application
Le paramètre Minimum de l’application de la version du projet C# détermine la version de .NET utilisée pour compiler l’application. Par exemple, choisir Windows 10 Fall Creators Update (10.0 ; build 16299) ou une version ultérieure activera .NET Standard 2.0 et la prise en charge des processeurs Windows Arm64.
Tip
Nous vous recommandons d’utiliser des versions Application Minimum inférieures à 16299 afin d’éviter une configuration de génération supplémentaire si la prise en charge de .NET Standard 2.0 ou d’Arm64 n’est pas nécessaire.
Configurer pour Windows 10 Fall Creators Update (10.0 ; Build 16299)
Suivez ces étapes pour activer la prise en charge de .NET Standard 2.0 ou de Windows Arm64 dans les projets C# référencés par votre projet C++/WinRT.
Dans Visual Studio, accédez au Explorateur de solutions et ouvrez le menu contextuel du projet CppToCSharpWinRT. Choisissez Propriétés et définissez la version minimale de l’application Windows universelle sur Windows 10 Fall Creators Update (10.0 ; Build 16299) (ou une version ultérieure). Procédez de la même façon pour le projet SampleComponent .
Dans Visual Studio, ouvrez le menu contextuel du projet CppToCSharpWinRT et choisissez Décharger le projet pour ouvrir CppToCSharpWinRT.vcxproj dans l’éditeur de texte.
Copiez et collez le code XML suivant dans le premier PropertyGroup dans CPPWinRTCSharpV2.vcxproj.
<!-- Start Custom .NET Native properties -->
<DotNetNativeVersion>2.2.12-rel-31116-00</DotNetNativeVersion>
<DotNetNativeSharedLibrary>2.2.8-rel-31116-00</DotNetNativeSharedLibrary>
<UWPCoreRuntimeSdkVersion>2.2.14</UWPCoreRuntimeSdkVersion>
<!--<NugetPath>$(USERPROFILE)\.nuget\packages</NugetPath>-->
<NugetPath>$(ProgramFiles)\Microsoft SDKs\UWPNuGetPackages</NugetPath>
<!-- End Custom .NET Native properties -->
Les valeurs pour DotNetNativeVersion, DotNetNativeSharedLibraryet UWPCoreRuntimeSdkVersion peuvent varier en fonction de la version de Visual Studio. Pour leur attribuer les valeurs correctes, ouvrez le %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages et regardez le sous-répertoire correspondant à chaque valeur dans le tableau ci-dessous. Le %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler répertoire aura un sous-répertoire qui contient une version installée de .NET native qui commence par 2.2. Dans l’exemple ci-dessous, il s’agit de 2.2.12-rel-31116-00.
MSBuild Variable Répertoire Exemple : DotNetNativeVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler2.2.12-rel-31116-00DotNetNativeSharedLibrary %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.sharedlibrary2.2.8-rel-31116-00UWPCoreRuntimeSdkVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.UWPCoreRuntimeSdk2.2.14
Note
Il existe plusieurs architectures prises en charge pour Microsoft. Net.Native.SharedLibrary. Remplacez x64 par l’architecture appropriée. Par exemple, l’architecture arm64 se trouverait dans le %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary répertoire.
Ensuite, immédiatement après le premier PropertyGroup, ajoutez ce qui suit (non inchangé).
<!-- Start Custom .NET Native targets -->
<!-- Import all of the .NET Native / CoreCLR props at the beginning of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.props" />
<!-- End Custom .NET Native targets -->
À la fin du fichier project, juste avant la balise de fermetureProject, ajoutez ce qui suit (non inchangé).
<!-- Import all of the .NET Native / CoreCLR targets at the end of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.targets" />
<!-- End Custom .NET Native targets -->
Rechargez le fichier projet dans Visual Studio. Pour ce faire, dans le Visual Studio Explorateur de solutions, ouvrez le menu contextuel de l’project CppToCSharpWinRT et choisissez Recharger Project.
Création pour .NET Native
Il est recommandé de compiler et de tester votre application avec le composant C# compilé pour .NET Native. Dans Visual Studio, ouvrez le menu contextuel du projet CppToCSharpWinRT et choisissez Décharger le projet pour ouvrir CppToCSharpWinRT.vcxproj dans l’éditeur de texte.
Ensuite, définissez la propriété UseDotNetNativeToolchain sur true dans les configurations Release et Arm64 du fichier de projet C++.
Dans l’Explorateur de solutions de Visual Studio, ouvrez le menu contextuel du projet CppToCSharpWinRT et choisissez Recharger le projet.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
Référencer d’autres packages NuGet en C#
Si le composant C# fait référence à d’autres packages nuget, le fichier projet de l’application peut avoir besoin de dépendances de fichier de liste à partir du package nuget en tant que contenu de déploiement. Par exemple, si le composant C# fait référence au package nuget Newtonsoft.Json, le même package nuget et la même dépendance de fichier doivent également être référencés dans le projet d’application.
Dans le fichier SampleComponent.csproj , ajoutez la référence du package nuget :
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
Dans le projet CppToCSharpWinRT , recherchez le fichier packages.config et ajoutez la référence nuget appropriée. Cela installe le package nuget dans le dossier de package de la solution.
Dans packages.config, ajoutez la même référence de package nuget :
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
Ajoutez ensuite ce qui suit au fichier projet d’application pour référencer la dépendance de fichier appropriée à partir du dossier de package de la solution. Par exemple, dans CppToCSharpWinRT.vcxproj ajoutez les éléments suivants :
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
Rubriques connexes
Windows developer