Procédure pas à pas—Créez un composant C#/WinRT et consommez-le à partir de C++/WinRT

C#/WinRT permet aux développeurs utilisant .NET de créer leurs propres composants Windows Runtime en C# à l'aide d'un projet de bibliothèque de classes. Les composants créés peuvent ensuite être consommés dans des applications de bureau natives sous la forme d’une référence de package ou d’une référence de projet après quelques modifications.

Cette procédure pas à pas montre comment créer un composant Windows Runtime simple avec C#/WinRT, comment distribuer le composant sous la forme d’un package NuGet et comment consommer le composant à partir d’une application console C++/WinRT. Pour obtenir l’exemple complet qui fournit le code utilisé dans cet article, consultez l’exemple de création C#/WinRT. Pour plus d’informations sur la création, consultez Création de composants.

Pour une procédure pas à pas sur la création de contrôles WinUI avec C#/WinRT spécifiquement destinés à être utilisés dans les applications du SDK d'application Windows, reportez-vous à l'article Procédure pas à pas : créer un composant C# avec des contrôles WinUI 3 et consommer à partir d'une application SDK d'application Windows C++

Prerequisites

Cette procédure pas à pas nécessite les composants et outils suivants :

Créer un composant Windows Runtime simple avec C#/WinRT

Commencez par créer un nouveau projet dans Visual Studio. Sélectionnez le modèle de projet Class Library et nommez le projet AuthoringDemo. Vous devrez apporter les ajouts et modifications suivants au projet :

  1. Mettez à jour TargetFramework dans le fichier AuthoringDemo.csproj et ajoutez les éléments suivants sous PropertyGroup :

    <PropertyGroup>
        <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
        <Platforms>x64</Platforms>
    </PropertyGroup>
    

    Pour accéder aux types de Windows Runtime, vous devez définir une version spécifique du SDK Windows dans le TFM. Pour plus de détails sur la version prise en charge, consultez .NET 6 et versions ultérieures : Utiliser l'option TFM.

  2. Installez le package Microsoft.Windows.CsWinRT NuGet dans votre projet.

    a. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Gérer les packages NuGet.

    b. Recherchez le package NuGet appelé Microsoft.Windows.CsWinRT et installez la dernière version. Cette procédure pas à pas utilise C#/WinRT version 1.4.1.

  3. Ajoutez un nouvel élément PropertyGroup qui définit la propriété CsWinRTComponent. Cela spécifie que votre projet est un composant Windows Runtime afin qu'un fichier .winmd soit généré lorsque vous générez le projet.

    <PropertyGroup>   
        <CsWinRTComponent>true</CsWinRTComponent>
    </PropertyGroup>
    

    Pour obtenir une liste complète des propriétés de projet C#/WinRT, consultez la documentation NuGet relative à C#/WinRT.

  4. Vous pouvez créer vos classes d'exécution à l'aide de fichiers de classe .cs de bibliothèque. Faites un clic droit sur le fichier Class1.cs et renommez-le en Example.cs. Ajoutez le code suivant à ce fichier pour ajouter une méthode et une propriété publiques à la classe runtime. N'oubliez pas de marquer toutes les classes que vous souhaitez exposer dans le composant d'exécution comme public.

    namespace AuthoringDemo
    {
        public sealed class Example
        {
            public int SampleProperty { get; set; }
    
            public static string SayHello()
            {
                return "Hello from your C# WinRT component";
            }
        }
    }
    
  5. Vous pouvez maintenant créer le projet pour générer le fichier .winmd pour votre composant. Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et cliquez sur Créer. Vous verrez le fichier AuthoringDemo.winmd généré dans votre dossier de sortie de build.

Générer un package NuGet pour le composant

La plupart des développeurs souhaiteront distribuer et partager leur composant Windows Runtime sous forme de package NuGet. Une autre option consiste à utiliser le composant comme référence de projet. Les étapes suivantes montrent comment empaqueter le composant AuthoringDemo. Lorsque vous générez le package, C#/WinRT configure le composant et les assemblys d’hébergement dans le package pour permettre la consommation à partir d’applications natives.

Il y a plusieurs façons de générer le package NuGet :

  • Si vous souhaitez générer un package NuGet à chaque nouvelle génération du projet, ajoutez la propriété suivante au fichier projet AuthoringDemo, puis regénérez le projet.

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    
  • Vous pouvez aussi générer un package NuGet en cliquant avec le bouton droit sur le projet AuthoringDemo dans l’Explorateur de solutions et en sélectionnant Compresser.

Quand vous générez le package, la fenêtre Build doit indiquer que le package NuGet AuthoringDemo.1.0.0.nupkg a bien été créé. Consultez Créer un package à l’aide de la CLI dotnet pour plus de détails sur les propriétés du package NuGet avec la CLI .NET.

Consommer le composant à partir d’une application C++/WinRT

Les composants Windows Runtime créés en C#/WinRT peuvent être consommés à partir de n’importe quel langage compatible Windows Runtime (WinRT). Les étapes suivantes montrent comment appeler le composant créé ci-dessus dans une application console C++/WinRT.

Note

La consommation d’un composant C#/WinRT à partir d’applications C#/.NET est prise en charge à la fois par la référence de package et la référence de projet. Ce scénario est équivalent à la consommation d’une bibliothèque de classes C# standard et n’implique pas l’activation de WinRT dans la plupart des cas. À compter de C#/WinRT 1.3.5, les références de projet pour les consommateurs C# requièrent .NET 6.

  1. Ajoutez un projet application console C++/WinRT à votre solution. Notez que ce projet peut également faire partie d’une autre solution si vous le souhaitez.

    a. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nœud de votre solution, puis cliquez sur Ajouter ->Nouveau projet.

    b. Dans la boîte de dialogue Ajouter un projet, recherchez le modèle de projet Application console C++/WinRT. Sélectionnez le modèle et cliquez sur Suivant.

    c. Nommez le nouveau projet CppConsoleApp, puis cliquez sur Créer.

  2. Ajoutez une référence au composant AuthoringDemo, sous la forme d’une référence de projet ou d’une référence de package NuGet.

    • Option 1 (Référence de package) :

      a. Cliquez avec le bouton droit sur le projet CppConsoleApp et sélectionnez Gérer les packages NuGet. Vous devez peut-être configurer vos sources de package pour ajouter une référence au package NuGet AuthoringDemo. Pour cela, cliquez sur l’icône Paramètres dans le Gestionnaire de packages NuGet et ajoutez une source de package au chemin approprié.

      Paramètres NuGet

      b. Après avoir configuré les sources de package, recherchez le package AuthoringDemo et cliquez sur Installer.

      Installer le package NuGet

    • Option 2 (Référence de projet) :

      a. Cliquez avec le bouton droit sur le projet CppConsoleApp, puis sélectionnez Ajouter ->Référence. Sous le nœud Projets, ajoutez une référence au projet AuthoringDemo.

  3. Pour héberger le composant, vous devrez ajouter un fichier manifeste pour les inscriptions aux classes activables. Pour plus d’informations sur l’hébergement de composants managés, consultez Hébergement des composants managés.

    a. Pour ajouter le fichier manifeste, recliquez avec le bouton droit sur le projet et choisissez Ajouter -> Nouvel élément. Recherchez le modèle Fichier texte et nommez-le CppConsoleApp.exe.manifest. Collez le contenu suivant, qui spécifie les classes d'exécution à l'aide d'entrées d'enregistrement de classe activables :

    <?xml version="1.0" encoding="utf-8"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
        <assemblyIdentity version="1.0.0.0" name="CppConsoleApp"/>
        <file name="WinRT.Host.dll">
            <activatableClass
                name="AuthoringDemo.Example"
                threadingModel="both"
                xmlns="urn:schemas-microsoft-com:winrt.v1" />
        </file>
    </assembly>
    

    Le fichier manifeste d’application est requis pour les applications qui ne sont pas packagées. Pour les applications packagées, le consommateur de l'application doit enregistrer les classes activables dans son fichier manifeste de package Package.appxmanifest, comme expliqué dans Procédure pas à pas : créer un composant C# avec des contrôles WinUI 3 et consommer à partir d'une application SDK d'application Windows C++.

    b. Modifiez le projet afin d’ajouter le fichier manifeste dans la sortie lors du déploiement du projet. Cliquez sur le fichier CppConsoleApp.exe.manifest dans l’Explorateur de solutions et définissez la propriété Content sur True. Voici un exemple du résultat.

    Développer Content

  4. Ouvrez pch.h sous la section Fichiers d’en-tête du projet, et ajoutez la ligne de code ci-dessous pour ajouter votre composant.

    #include <winrt/AuthoringDemo.h>
    
  5. Ouvrez main.cpp sous la section Fichiers sources du projet, et remplacez le contenu par le contenu suivant.

    #include "pch.h"
    #include "iostream"
    
    using namespace winrt;
    using namespace Windows::Foundation;
    
    int main()
    {
        init_apartment();
    
        AuthoringDemo::Example ex;
        ex.SampleProperty(42);
        std::wcout << ex.SampleProperty() << std::endl;
        std::wcout << ex.SayHello().c_str() << std::endl;
    }
    
  6. Générez et exécutez le projet CppConsoleApp. Normalement, vous voyez maintenant cette sortie.

    Sortie de console C++/WinRT