Megosztás a következőn keresztül:


C# Windows futtatókörnyezeti ö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.

A Visual Studio segítségével egyszerűen létrehozhatja és üzembe helyezheti saját egyéni Windows-futtatókörnyezet-típusait egy C# vagy Visual Basic használatával írt Windows-futtatókörnyezeti (WRC) projektben, majd hivatkozhat erre a WRC-re egy C++ alkalmazásprojektből, és felhasználhatja ezeket az egyéni típusokat az adott alkalmazásból.

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

Külsőleg a típus tagjai csak a Windows futtatókörnyezeti típusok számára tehetnek közzé paramétereket, és visszaadhatják az értékeket. A megoldás létrehozásakor a 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 a Windows Futtatókörnyezet összetevő (WRC), amelyet a Visual Studio belefoglal az alkalmazásodba.

Megjegyzés:

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

Előfeltételek

Üres alkalmazás létrehozása

A Visual Studióban hozzon létre egy új projektet az Üres alkalmazás (C++/WinRT) projektsablon használatával. 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, hogy a mappaszerkezet megfeleljen az áttekintésnek.

C# Windows futtatókörnyezeti ö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 , és válassza a Hozzáadás, majd az Új projekt lehetőséget egy új C#-projekt megoldáshoz való hozzáadásához. Az Új projekt 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 a Windows Futtatókörnyezet-összetevő (Univerzális Windows) sablont, és adja meg a mintaösszetevőt a projekt nevéhez.

Megjegyzés:

Az Új univerzális Windows-platform projekt párbeszédpanelen válassza ki a Minimális verzióhoz a Windows 10 Készítők frissítése (10.0; build 15063). 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-ről Example-ra. 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}";
        }
    }

Megjegyzés:

Alapértelmezés szerint az osztály nyilvános, lezárt megjelöléssel rendelkezik. Az összetevőből közzétett windowsos futtatókörnyezeti osztályoknak lezártkell lenniük.

Megjegyzés:

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

A CppToCSharpWinRT projekt C# SampleComponentjének hivatkozása

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

Megjegyzés:

Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t a C++/WinRT projekthez, nyissa meg a CppToCSharpWinRT projekt helyi menüjét a Megoldáskezelőben, 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 az #include utasítások végére, 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;
...
    };
}

Megjegyzés:

A Visual Studióban a MainPage.h szerepel a MainPage.xaml alatt.

MainPage.cpp szerkesztése

A MainPage.cpp-ban módosítsa a Mainpage::ClickHandler implementációt úgy, hogy a C# metódust, GetMyString-t 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.

A C++/WinRT Windowsból egy C#-összetevőhöz történő hívás képernyőképe

Jótanács

A Visual Studióban hozza létre az összetevőprojektet: A Megoldáskezelőben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Tulajdonságok lehetőséget, majd a Konfiguráció tulajdonságai területen válassza a Hibakeresés lehetőséget. 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ó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 processzor támogatását.

Jótanács

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

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

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

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

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

Másolja és illessze be a következő XML-t az első PropertyGroup-ba az CPPWinRTCSharpV2.vcxproj-ben.

   <!-- 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 DotNetNativeVersion, DotNetNativeSharedLibrary, és UWPCoreRuntimeSdkVersion értékei a Visual Studio verziójától függően változhatnak. Ha a megfelelő értékekre szeretné állítani őket, nyissa meg a %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages, és tekintse meg az alkönyvtárat az alábbi táblázatban szereplő összes értékhez. A %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler címtárnak lesz egy alkönyvtára, amely tartalmazza a .NET natív verziójának 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 példa
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

Megjegyzés:

A Microsoft.Net.Native.SharedLibrary több támogatott architektúrát is kínál. Cserélje az x64-t a megfelelő architektúrára. Az architektúra például arm64 a %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary könyvtárban lenne.

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 projektfájl végén, a záró Project címke előtt adja hozzá a következőt (változatlanul).

  <!-- 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 Studióban. Ehhez a Visual Studio Megoldáskezelőben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt újratöltéselehetőséget.

.NET Native-re fejlesztés

Javasoljuk, hogy az alkalmazást a .NET natív rendszerén alapuló C# összetevővel hozza létre és tesztelje. A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt törlése lehetőséget a CppToCSharpWinRT.vcxproj szövegszerkesztőben való megnyitásához.

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

A Visual Studio Solution Explorerben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt újratöltéselehető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.

Adja hozzá ugyanazt a nuget csomag hivatkozását a packages.config:

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