Sdílet prostřednictvím


Vytvoření komponenty C# Windows Runtime pro použití z aplikace C++/WinRT

Toto téma vás provede procesem přidání jednoduché komponenty C# do projektu C++/WinRT.

Visual Studio usnadňuje vytváření a nasazování vlastních typů prostředí Windows Runtime uvnitř projektu komponenty Windows Runtime (WRC) napsaného v jazyce C# nebo Visual Basic a následné odkazování na tento objekt WRC z projektu aplikace C++ a využívání těchto vlastních typů z této aplikace.

Interně můžou vaše typy prostředí Windows Runtime používat jakékoli funkce .NET, které jsou povolené v aplikaci pro UPW.

Externě můžou členové vašeho typu vystavit pouze typy prostředí Windows Runtime pro jejich parametry a návratové hodnoty. Když sestavíte řešení, Visual Studio sestaví projekt WRC .NET a pak spustí krok sestavení, který vytvoří soubor metadat Windows (.winmd). Toto je komponenta prostředí Windows Runtime (WRC), kterou Visual Studio obsahuje ve vaší aplikaci.

Poznámka:

.NET automaticky mapuje některé běžně používané typy .NET, jako jsou primitivní datové typy a typy kolekcí, na jejich ekvivalenty prostředí Windows Runtime. Tyto typy .NET lze použít ve veřejném rozhraní komponenty Windows Runtime a zobrazí se uživatelům komponenty jako odpovídající typy prostředí Windows Runtime. Podívejte se na součásti prostředí Windows Runtime s jazykem C# a Visual Basic.

Požadavky

Vytvoření prázdné aplikace

V aplikaci Visual Studio vytvořte nový projekt pomocí šablony projektu Prázdná aplikace (C++/WinRT). Ujistěte se, že používáte šablonu (C++/WinRT), a ne (Universal Windows).

Nastavte název nového projektu na CppToCSharpWinRT tak, aby struktura složek odpovídala návodu.

Přidání komponenty C# Windows Runtime do řešení

Ve Visual Studio vytvořte projekt komponenty: V Průzkumníku řešení klikněte pravým tlačítkem na CppToCSharpWinRT řešení a vyberte Přidat, poté vyberte Nový projekt pro přidání nového projektu C# do řešení. V části Nainstalované šablony dialogového okna Přidat nový projekt zvolte Visual C# a pak zvolte Windowsa pak Univerzální. Zvolte šablonu komponent prostředí Windows Runtime (Universal Windows) a jako název projektu zadejte SampleComponent .

Poznámka:

V dialogovém okně Nový projekt univerzální platformy Windows zvolte Windows 10 Creators Update (10.0; Build 15063) jako minimální verze Další informace najdete v části Minimální verze aplikace níže.

Přidání metody GetMyString v C#

V projektu SampleComponent změňte název třídy z Třídy1 na Příklad. Pak do třídy přidejte dva jednoduché členy, privátní int pole a metodu instance s názvem GetMyString:

    public sealed class Example
    {
        int MyNumber;

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

Poznámka:

Ve výchozím nastavení je třída označena veřejné zapečetěné. Všechny třídy prostředí Windows Runtime, které zpřístupňujete z vaší komponenty, musí být zapečetěné.

Poznámka:

Volitelné: Pokud chcete povolit IntelliSense pro nově přidané členy, otevřete v Průzkumníku řešení místní nabídku pro projekt SampleComponent a pak zvolte Sestavení.

Odkazování na ukázkovou součást jazyka C# z projektu CppToCSharpWinRT

V Průzkumníku řešení otevřete v projektu C++/WinRT místní nabídku pro Referencea pak zvolte Přidat odkaz, abyste otevřeli dialogové okno Přidat odkaz. Zvolte Projektya pak zvolte Řešení. Zaškrtněte políčko u projektu SampleComponent a zvolte OK a přidejte odkaz.

Poznámka:

Volitelné: Chcete-li povolit IntelliSense pro projekt C++/WinRT, otevřete v Průzkumníku řešení kontextovou nabídku pro CppToCSharpWinRT projektu a pak zvolte Sestavení.

Upravit MainPage.h

Otevřete MainPage.h v projektu CppToCSharpWinRT a přidejte dvě položky. Nejprve přidejte #include "winrt/SampleComponent.h" na konec #include příkazů, poté přidejte winrt::SampleComponent::Example pole do MainPage struktury.

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

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

Poznámka:

V sadě Visual Studio je MainPage.h uveden v seznamu pod MainPage.xaml.

Upravit MainPage.cpp

Změňte MainPage.cppimplementaci Mainpage::ClickHandler tak, aby volala metodu GetMyStringjazyka C#.

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

    hstring myString = myExample.GetMyString();

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

Spusťte projekt

Teď můžete sestavit a spustit projekt. Pokaždé, když na tlačítko kliknete, se číslo v tlačítku zvýší.

snímek obrazovky C++/WinRT Windows volání do komponenty C#

Návod

V sadě Visual Studio vytvořte projekt komponenty: V Průzkumníku řešení otevřete místní nabídku projektu CppToCSharpWinRT a zvolte Vlastnostia potom v části Vlastnosti konfiguracezvolte Ladění . Pokud chcete ladit kód C# (spravovaný) i C++ (nativní), nastavte typ ladicího programu na spravovaný a nativní . Ladící vlastnosti C++

Minimální verze aplikace

Minimální aplikace verze projektu jazyka C# řídí verzi rozhraní .NET použitou ke kompilaci aplikace. Například volba Windows 10 Fall Creators Update (10.0; Build 16299) nebo novější povolí podporu procesoru .NET Standard 2.0 a Windows Arm64.

Návod

Doporučujeme použít minimální verze aplikace nižší než 16299, abyste se vyhnuli další konfiguraci sestavení, pokud není nutná podpora .NET Standard 2.0 nebo Arm64.

Konfigurace pro Windows 10 Fall Creators Update (10.0; Build 16299)

Pokud chcete povolit podporu .NET Standard 2.0 nebo Windows Arm64 v projektech C# odkazovaných z projektu C++/WinRT, postupujte podle těchto kroků.

Ve Visual Studiu přejděte do Průzkumníka řešení a otevřete místní nabídku pro projekt CppToCSharpWinRT. Zvolte Vlastnosti a nastavte minimální verzi aplikace Universal Windows na Windows 10 Fall Creators Update (10.0; Build 16299) (nebo vyšší). Totéž proveďte u projektu SampleComponent .

V sadě Visual Studio otevřete místní nabídku projektu CppToCSharpWinRT a zvolte Uvolnit projektu a otevřete CppToCSharpWinRT.vcxproj v textovém editoru.

Zkopírujte a vložte následující kód XML na první PropertyGroup v souboru 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 -->

Hodnoty pro DotNetNativeVersion, DotNetNativeSharedLibrarya UWPCoreRuntimeSdkVersion mohou se lišit v závislosti na verzi sady Visual Studio. Pokud je chcete nastavit na správné hodnoty, otevřete %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages a podívejte se do podadresáře pro každou hodnotu v tabulce níže. Tento %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler adresář bude mít podadresář, který obsahuje nainstalovanou verzi .NET Native, která začíná 2.2. V následujícím příkladu je 2.2.12-rel-31116-00.

Proměnná MSBuild Adresář Příklad
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

Poznámka:

Existuje několik podporovaných architektur pro Microsoft.Net.Native.SharedLibrary. Nahraďte x64 příslušnou architekturou. Například arm64 architektura by byla v adresáři %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary .

V dalším kroku bezprostředně za první PropertyGrouppřidejte následující (beze změny).

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

Na konec souboru projektu, těsně před uzavírací značku Project, přidejte následující (beze změn).

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

Znovu načtěte soubor projektu v sadě Visual Studio. V Průzkumníku řešení ve Visual Studiu klikněte pravým tlačítkem na projekt CppToCSharpWinRT a vyberte možnost Znovu načíst projekt.

Sestavení pro .NET Native

Doporučuje se sestavit a otestovat aplikaci pomocí komponenty jazyka C# sestavené proti .NET Native. V sadě Visual Studio otevřete místní nabídku projektu CppToCSharpWinRT a zvolte Uvolnit projektu a otevřete CppToCSharpWinRT.vcxproj v textovém editoru.

Nastavte UseDotNetNativeToolchain vlastnost na true v konfiguracích Release a Arm64 v souboru projektu C++.

V Průzkumníku řešení sady Visual Studio otevřete místní nabídku projektu CppToCSharpWinRT a zvolte Znovu načíst projekt.

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

Odkazování na další balíčky NuGet jazyka C#

Pokud komponenta C# odkazuje na jiné balíčky NuGet, může soubor projektu aplikace potřebovat jako obsah nasazení seznam závislostí souborů z balíčku NuGet. Pokud například komponenta C# odkazuje na balíček NuGet Newtonsoft.Json, měl by být v projektu aplikace odkazován také stejný balíček NuGet a závislost souboru.

Do souboru SampleComponent.csproj přidejte odkaz na balíček NuGet:

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

V projektu CppToCSharpWinRT vyhledejte soubor packages.config a přidejte příslušný odkaz nuget. Tím se balíček NuGet nainstaluje do složky balíčku řešení.

V packages.configpřidejte stejný odkaz na balíček NuGet:

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

Potom do souboru projektu aplikace přidejte následující příkaz, který bude odkazovat na příslušnou závislost souboru ze složky balíčku řešení. Například v CppToCSharpWinRT.vcxproj přidejte následující:

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