Genomgång – Skapa en C#/WinRT-komponent och använd den från C++/WinRT

Med C#/WinRT kan utvecklare som använder .NET skapa egna Windows Runtime-komponenter i C# med hjälp av ett klassbiblioteksprojekt. Författade komponenter kan användas i interna skrivbordsprogram som en paketreferens eller som en projektreferens med några ändringar.

Den här genomgången visar hur du skapar en enkel Windows Runtime-komponent med C#/WinRT, distribuerar komponenten som ett NuGet-paket och använder komponenten från ett C++/WinRT-konsolprogram. Det fullständiga exemplet som innehåller koden för den här artikeln finns i C#/WinRT-redigeringsexemplet. Mer information om redigering finns i Redigera komponenter.

En genomgång av hur du redigerar WinUI-kontroller med C#/WinRT specifikt för användning i Windows App SDK-program finns i artikeln Genomgång: Skapa en C#-komponent med WinUI 3-kontroller och använda från ett C++ Windows App SDK-program

Förutsättningar

Den här genomgången kräver följande verktyg och komponenter:

Skapa en enkel Windows Runtime-komponent med C#/WinRT

Börja med att skapa ett nytt projekt i Visual Studio. Välj projektmallen Klassbibliotek och ge projektet namnet AuthoringDemo. Du måste göra följande tillägg och ändringar i projektet:

  1. TargetFramework Uppdatera i filen AuthoringDemo.csproj och lägg till följande element i PropertyGroup:

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

    För att få åtkomst till Windows Runtime-typer måste du ange en specifik Windows SDK-version i TFM. Mer information om den version som stöds finns i .NET 6 och senare: Använd TFM-alternativet.

  2. Installera NuGet-paketet Microsoft.Windows.CsWinRT i projektet.

    a. Högerklicka på projektnoden i Solution Explorer och välj Hantera NuGet-paket.

    b) Sök efter NuGet-paketet Microsoft.Windows.CsWinRT och installera den senaste versionen. Den här genomgången använder C#/WinRT version 1.4.1.

  3. Lägg till ett nytt PropertyGroup element som anger egenskapen CsWinRTComponent . Detta anger att projektet är en Windows Runtime-komponent så att en .winmd fil genereras när du skapar projektet.

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

    En fullständig lista över C#/WinRT-projektegenskaper finns i dokumentationen om C#/WinRT NuGet.

  4. Du kan skapa dina körningsklasser med hjälp av klassfiler från bibliotek .cs. Högerklicka på filen och byt namn på Class1.cs den till Example.cs. Lägg till följande kod i den här filen, vilken lägger till en offentlig egenskap och metod till runtime-klassen. Kom ihåg att markera alla klasser som du vill exponera i körningskomponenten som public.

    namespace AuthoringDemo
    {
        public sealed class Example
        {
            public int SampleProperty { get; set; }
    
            public static string SayHello()
            {
                return "Hello from your C# WinRT component";
            }
        }
    }
    
  5. Nu kan du skapa projektet för att generera .winmd filen för komponenten. Högerklicka på projektet i Solution Explorer och klicka på Skapa. I utdatamappen för byggprocessen kommer du att se den genererade AuthoringDemo.winmd-filen.

Generera ett NuGet-paket för komponenten

De flesta utvecklare vill distribuera och dela sin Windows Runtime-komponent som ett NuGet-paket. Ett annat alternativ är att använda komponenten som en projektreferens. Följande steg visar hur du paketerar AuthoringDemo-komponenten . När du genererar paketet konfigurerar C#/WinRT komponenten och värdsammansättningarna i paketet för att aktivera förbrukning från interna program.

Det finns flera sätt att generera NuGet-paketet:

  • Om du vill generera ett NuGet-paket varje gång du skapar projektet lägger du till följande egenskap i AuthoringDemo-projektfilen och återskapar sedan projektet.

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    
  • Du kan också generera ett NuGet-paket genom att högerklicka på AuthoringDemo-projektet i Solution Explorer och välja Paket.

När du skapar paketet bör fönstret Skapa ange att NuGet-paketet AuthoringDemo.1.0.0.nupkg har skapats. Mer information om NuGet-paketegenskaper med .NET CLI finns i Skapa ett paket med dotnet CLI .

Utnyttja komponenten från en C++/WinRT-app

C#/WinRT-redigerade Windows Runtime-komponenter kan användas från valfritt WinRT-kompatibelt språk (Windows Runtime). Följande steg visar hur du anropar den skapade komponenten ovan i ett C++/WinRT-konsolprogram.

Anmärkning

Användning av en C#/WinRT-komponent från C#/.NET-appar stöds av både paketreferensen eller projektreferensen. Det här scenariot motsvarar användning av vanliga C#-klassbibliotek och innebär i de flesta fall inte WinRT-aktivering. Från och med C#/WinRT 1.3.5 kräver projektreferenser för C#-konsumenter .NET 6.

  1. Lägg till ett nytt C++/WinRT-konsolprogramprojekt i din lösning. Observera att det här projektet också kan ingå i en annan lösning om du väljer det.

    a. Högerklicka på lösningsnoden i Solution Explorer och klicka på Lägg till ->Nytt projekt.

    b) I dialogrutan Lägg till nytt projekt söker du efter projektmallen C++/WinRT-konsolprogram . Välj mallen och klicka på Nästa.

    Punkt c Ge det nya projektet namnet CppConsoleApp och klicka på Skapa.

  2. Lägg till en referens till AuthoringDemo-komponenten, antingen som ett NuGet-paket eller en projektreferens.

    • Alternativ 1 (paketreferens):

      a. Högerklicka på CppConsoleApp-projektet och välj Hantera NuGet-paket. Du kan behöva konfigurera paketkällorna för att lägga till en referens till AuthoringDemo NuGet-paketet. Det gör du genom att klicka på ikonen Inställningar i NuGet Package Manager och lägga till en paketkälla i rätt sökväg.

      NuGet-inställningar

      b) När du har konfigurerat paketkällorna söker du efter AuthoringDemo-paketet och klickar på Installera.

      Installera NuGet-paketet

    • Alternativ 2 (projektreferens):

      a. Högerklicka på CppConsoleApp-projektet och välj Lägg till ->Referens. Under noden Projekt lägger du till en referens till AuthoringDemo-projektet .

  3. För att vara värd för komponenten måste du lägga till en manifestfil för aktiverbara klassregistreringar. För mer information om hanteringsvärd för hanterade komponenter, se Hantering av hanterade komponenter.

    a. Om du vill lägga till manifestfilen högerklickar du igen på projektet och väljer Lägg till –> nytt objekt. Sök efter textfilmallen och ge den namnet CppConsoleApp.exe.manifest. Klistra in följande innehåll som anger körningsklasserna med hjälp av aktiverade klassregistreringsposter:

    <?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>
    

    Programmanifestfilen krävs för appar som inte är paketerade. För paketerade appar måste appkonsumenten registrera de aktiverande klasserna i paketmanifestfilen Package.appxmanifest , enligt beskrivningen i Genomgång: Skapa en C#-komponent med WinUI 3-kontroller och använda från ett C++ Windows App SDK-program.

    b) Ändra projektet så att manifestfilen inkluderas i utdata när projektet distribueras. Klicka på denCppConsoleApp.exe.manifestfilen i Solution Explorer och ange egenskapen Innehåll till True. Här är ett exempel på hur detta ser ut.

    Distribuera innehåll

  4. Öppna pch.h under projektets Rubrikfiler och lägg till följande kodrad för att inkludera din komponent.

    #include <winrt/AuthoringDemo.h>
    
  5. Öppna main.cpp under projektets källfiler och ersätt det med följande innehåll.

    #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. Skapa och kör CppConsoleApp-projektet . Nu bör du se utdata nedan.

    C++/WinRT-konsolutmatning