C# Windows-futtatókörnyezet összetevő létrehozása C++/WinRT-alkalmazásból való használatra

Ez a témakör végigvezeti egy egyszerű C#-összetevő C++/WinRT-projekthez való hozzáadásának folyamatán.

Visual Studio megkönnyíti saját egyéni Windows-futtatókörnyezet-típusok készítését és üzembe helyezését egy C# vagy Visual Basic írt Windows-futtatókörnyezet-összetevő (WRC) projektben, majd hivatkozhat erre a WRC-re egy C++ alkalmazásprojektből, és felhasználhatja az adott alkalmazásból származó egyéni típusokat.

Belsőleg a Windows-futtatókörnyezet-típusok bármilyen .NET funkciót használhatnak, amely egy UWP-alkalmazásban engedélyezett.

Külsőleg a típus tagjai csak Windows-futtatókörnyezet típusokat tehetnek közzé a paramétereikhez, és visszaadhatják az értékeket. A megoldás létrehozásakor Visual Studio létrehozza a .NET WRC-projektet, majd végrehajt egy buildelési lépést, amely létrehoz egy Windows metaadatfájlt (.winmd). Ez az Ön Windows-futtatókörnyezet-összetevője (WRC), amelyet a Visual Studio foglal bele az alkalmazásába.

Note

.NET automatikusan leképez néhány gyakran használt .NET típust, például a primitív adattípusokat és a gyűjteménytípusokat a Windows-futtatókörnyezet megfelelőikre. Ezek a .NET típusok használhatók egy Windows-futtatókörnyezet összetevő nyilvános felületén, és az összetevő felhasználói számára a megfelelő Windows-futtatókörnyezet típusokként jelennek meg. Tekintse meg Windows-futtatókörnyezet C# és Visual Basic összetevőket.

Prerequisites

Üres alkalmazás létrehozása

Az Visual Studio hozzon létre egy új projektet az Üres alkalmazás (C++/WinRT) projektsablon használatával (WinUI 3 asztali alkalmazások esetén használja az Üres alkalmazás, Csomagolt (WinUI 3 in Desktop) sablont). Győződjön meg arról, hogy a (C++/WinRT) sablont használja, és nem az (univerzális Windows) sablont.

Állítsa be az új projekt nevét CppToCSharpWinRT értékre, hogy a mappaszerkezet megfeleljen az útmutatónak.

C# Windows-futtatókörnyezet összetevő hozzáadása a megoldáshoz

A Visual Studióban hozza létre az összetevőprojektet: A Megoldáskezelőben nyissa meg a CppToCSharpWinRT megoldás helyi menüjét, válassza a Hozzáadás, majd az Új projekt lehetőséget, ha új C#-projektet szeretne a megoldáshoz adni. Az Új Project hozzáadása párbeszédpanel Telepített sablonok szakaszában válassza a Visual C#, majd a Windows, majd az Univerzális lehetőséget. Válassza ki az Windows-futtatókörnyezet Összetevő (Univerzális Windows) sablont, és adja meg a Mintakomponens nevet a projekt nevéhez.

Note

Az Új Univerzális Windows-platform projekt párbeszédpanelen válassza a Windows 10 Creators Update (10.0; Build 15063) lehetőséget minimális verzióként. További információért tekintse meg az alkalmazás minimális verziója című szakaszt.

A C# GetMyString metódus hozzáadása

A SampleComponent projektben módosítsa az osztály nevét Class1 névről Example névre. Ezután adjon hozzá két egyszerű tagot az osztályhoz, egy privát int mezőt és egy GetMyString nevű példánymetódust:

    public sealed class Example
    {
        int MyNumber;

        public string GetMyString()
        {
            return $"This is call #: {++MyNumber}";
        }
    }

Note

Alapértelmezés szerint az osztály nyilvánosan lezártként van megjelölve. A komponensből közzétett összes Windows-futtatókörnyezet osztálynak lezártnak kell lennie.

Note

Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t az újonnan hozzáadott tagok számára, a Megoldáskezelő nyissa meg a SampleComponent projekt helyi menüjét, majd válassza a Build lehetőséget.

A CppToCSharpWinRT projekt C# SampleComponentjének hivatkozása

A Megoldáskezelő C++/WinRT projektben nyissa meg a Hivatkozások helyi menüjét, majd a Hivatkozás hozzáadásapárbeszédpanel megnyitásához válassza a Hivatkozás hozzáadása párbeszédpanelt. Válassza a Projektek, majd a Megoldás lehetőséget. Jelölje be a SampleComponent projekt jelölőnégyzetét, és hivatkozás hozzáadásához kattintson az OK gombra.

Note

Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t a C++/WinRT projekthez, nyissa meg a CppToCSharpWinRT projekt helyi menüjét Megoldáskezelő, majd válassza a Build lehetőséget.

MainPage.h szerkesztése

Nyissa meg MainPage.h a CppToCSharpWinRT projektben, majd vegyen fel két elemet. Először adja hozzá a #include "winrt/SampleComponent.h" elemet a #include utasítások végéhez, majd egy winrt::SampleComponent::Example mezőt a MainPage struktúrához.

// MainPage.h
...
#include "winrt/SampleComponent.h"

namespace winrt::CppToCSharpWinRT::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
...
        winrt::SampleComponent::Example myExample;
...
    };
}

Note

A Visual Studióban a(z) MainPage.h a(z) MainPage.xaml alatt található.

MainPage.cpp szerkesztése

A(z) MainPage.cpp elemben módosítsa az Mainpage::ClickHandler implementációt úgy, hogy a(z) GetMyString C#-metódust hívja meg.

void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
    //myButton().Content(box_value(L"Clicked"));

    hstring myString = myExample.GetMyString();

    myButton().Content(box_value(myString));
}

A projekt futtatása

Most már létrehozhatja és futtathatja a projektet. Minden alkalommal, amikor a gombra kattint, a gombban lévő szám növekszik.

Képernyőkép arról, hogy a C++/WinRT Windows hogyan hív meg egy C#-összetevőt

Tipp

A Visual Studio hozza létre az összetevőprojektet: A Megoldáskezelő nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Tulajdonságok lehetőséget, majd válassza a Hibakeresés lehetőséget a Konfiguráció tulajdonságai területen. Ha a C# (felügyelt) és a C++ (natív) kódot is szeretné hibakeresésre használni, állítsa a hibakereső típusát felügyelt és natív értékre. C++ hibakeresési tulajdonságok

Alkalmazás minimális verziója

A C# projektverzió Alkalmazásminimum értéke szabályozza az alkalmazás fordításához használt .NET verzióját. Például a Windows 10 Fall Creators Update (10.0; build 16299) vagy újabb verzió kiválasztása lehetővé teszi a .NET Standard 2.0 és a Windows Arm64 processzorok támogatását.

Tipp

Javasoljuk, hogy az 16299-nél kisebb alkalmazásminimum-verziókat használja az extra buildkonfiguráció elkerülése érdekében, ha .NET Standard 2.0- vagy Arm64-támogatás nem szükséges.

Konfigurálás a Windows 10 Fall Creators Update rendszerhez (10.0; 16299-es build)

Az alábbi lépéseket követve engedélyezheti .NET Standard 2.0-s vagy Windows Arm64-támogatást a C++/WinRT projektből hivatkozott C#-projektekben.

A Visual Studióban lépjen a Megoldáskezelőre, majd nyissa meg a CppToCSharpWinRT projekt helyi menüjét. Válassza a Tulajdonságok lehetőséget, és állítsa az Univerzális Windows-alkalmazás Minimális verziót Windows 10 Fall Creators Update (10.0; Build 16299) (vagy újabb). Tegye ugyanezt a SampleComponent projekt esetében is.

A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, majd a CppToCSharpWinRT.vcxproj szövegszerkesztőben való megnyitásához válassza a Projekt eltávolítása lehetőséget.

Másolja és illessze be a következő XML-t az első PropertyGroup elembe itt: 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 -->

A(z) DotNetNativeVersion, DotNetNativeSharedLibrary és UWPCoreRuntimeSdkVersion értékei a Visual Studio verziójától függően eltérhetnek. Ha a megfelelő értékekre szeretné állítani őket, nyissa meg az %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages alkönyvtárat, és tekintse meg az alábbi táblázatban szereplő összes érték alkönyvtárát. A %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler címtárnak lesz egy alkönyvtára, amely tartalmazza a natív .NET telepített verzióját, amely a következővel 2.2kezdődik: . Az alábbi példában ez: 2.2.12-rel-31116-00.

MSBuild változó Címtár Example
DotNetNativeVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler 2.2.12-rel-31116-00
DotNetNativeSharedLibrary %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.sharedlibrary 2.2.8-rel-31116-00
UWPCoreRuntimeSdkVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.UWPCoreRuntimeSdk 2.2.14

Note

A Microsoft.Net.Native.SharedLibrary számára több támogatott architektúra is létezik. Cserélje le x64 a megfelelő architektúrára. Például a arm64 architektúra a %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary könyvtárban található.

Ezután közvetlenül az első PropertyGroupután adja hozzá a következőt (változatlanul).

  <!-- Start Custom .NET Native targets -->
  <!-- Import all of the .NET Native / CoreCLR props at the beginning of the project -->
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\Microsoft.Net.UWPCoreRuntimeSdk.props" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.props" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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 -->

A project fájl végén, a záró Project címke előtt adja hozzá a következőt (változatlan).

  <!-- Import all of the .NET Native / CoreCLR targets at the end of the project -->
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.targets" />
  <Import Condition="'$(WindowsTargetPlatformMinVersion)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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)' &gt;= '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 -->

Töltse be újra a projektfájlt a Visual Studio. Ehhez nyissa meg a CppToCSharpWinRT project helyi menüjét a Visual Studio Megoldáskezelő, és válassza az Újratöltés Project lehetőséget.

Natív .NET létrehozása

Javasoljuk, hogy az alkalmazást a natív .NET beépített C#-összetevővel hozza létre és tesztelje. A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, majd a Unload Project parancsot választva nyissa meg a(z) CppToCSharpWinRT.vcxproj elemet a szövegszerkesztőben.

Ezután állítsa be a UseDotNetNativeToolchain tulajdonságot true a C++ projektfájl kiadási és Arm64-konfigurációiban.

A Visual Studio Megoldáskezelőben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, majd válassza a Projekt újratöltése lehetőséget.

  <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
    <UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
  </PropertyGroup>

Hivatkozás más C# nuget-csomagokra

Ha a C# összetevő más nuget-csomagokra hivatkozik, előfordulhat, hogy az alkalmazás projektfájljának üzembehelyezési tartalomként listáznia kell a nuget-csomag fájlfüggőségeit. Ha például a C# összetevő a Newtonsoft.Json nuget-csomagra hivatkozik, az alkalmazásprojektben is ugyanarra a nuget-csomagra és fájlfüggőségre kell hivatkoznia.

A SampleComponent.csproj fájlban adja hozzá a nuget-csomag hivatkozását:

    <PackageReference Include="Newtonsoft.Json">
      <Version>13.0.1</Version>
    </PackageReference>

A CppToCSharpWinRT projektben keresse meg a packages.config fájlt, és adja hozzá a megfelelő nuget-hivatkozást. Ezzel telepíti a nuget-csomagot a megoldás csomagmappájába.

A packages.configadja hozzá ugyanazt a nuget-csomaghivatkozást:

  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />

Ezután adja hozzá az alábbiakat az alkalmazásprojektfájlhoz, hogy hivatkozzon a megoldás csomagmappájában található megfelelő fájlfüggőségre. Például CppToCSharpWinRT.vcxproj adja hozzá a következőket:

  <ItemGroup>
    <None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
      <Link>%(Filename)%(Extension)</Link>
      <DeploymentContent>true</DeploymentContent>
    </None>
  </ItemGroup>