Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 prostředí Windows Runtime komponenty (WRC) napsaného pomocí jazyka C# nebo Visual Basic, a potom odkazovat na WRC z projektu aplikace C++ a využívat tyto vlastní typy z této aplikace.
Interně můžou vaše typy prostředí Windows Runtime používat libovolnou funkci .NET, která je povolená v aplikaci pro UPW.
Note
Další informace najdete v tématu Komponenty prostředí Windows Runtime pro C# a Visual Basic a .NET pro aplikace UWP – přehled.
Navenek mohou členové vašeho typu používat pro své parametry a návratové hodnoty pouze typy prostředí Windows Runtime. Při sestavování řešení Visual Studio sestaví projekt .NET WRC a pak spustí krok sestavení, který vytvoří soubor metadat Windows (.winmd). Toto je komponenta prostředí Windows Runtime (WRC), která Visual Studio zahrnuje ve vaší aplikaci.
Note
.NET automaticky mapuje některé běžně používané typy .NET, jako jsou primitivní datové typy a typy kolekcí, na jejich prostředí Windows Runtime ekvivalenty. Tyto typy .NET lze použít ve veřejném rozhraní komponenty prostředí Windows Runtime a uživatelům komponenty se zobrazí jako odpovídající typy prostředí Windows Runtime. Viz prostředí Windows Runtime komponenty v jazyce C# a Visual Basic.
Předpoklady
- Systém Windows 10
- Microsoft Visual Studio
Vytvoření prázdné aplikace
V Visual Studio vytvořte nový projekt pomocí šablony projektu Prázdná aplikace (C++/WinRT) (pro desktopové aplikace WinUI 3 použijte šablonu Prázdná aplikace, Zabalená (WinUI 3 v desktopové aplikaci). Ujistěte se, že používáte šablonu (C++/WinRT), a ne šablonu (Universal Windows).
Nastavte název nového projektu na CppToCSharpWinRT tak, aby struktura složek odpovídala návodu.
Přidání komponenty prostředí Windows Runtime jazyka C# do řešení
V Visual Studio vytvořte project komponenty: V Průzkumník řešení otevřete místní nabídku pro řešení CppToCSharpWinRT a zvolte Přidat a pak zvolte Nový Project a přidejte do řešení nový project C#. V části Nainstalované šablony v dialogovém okně Přidat nový Project zvolte Visual C# a pak zvolte Windows a potom Univerzální. Zvolte šablonu prostředí Windows Runtime Component (Universal Windows) a jako název projektu zadejte SampleComponent.
Note
V dialogovém okně Nový Univerzální platforma Windows Project 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}"; } }
Note
Ve výchozím nastavení je třída označena jako veřejná zapečetěná. Všechny třídy prostředí Windows Runtime, které z vaší komponenty zveřejňujete, musí být zapečetěné.
Note
Volitelné: Chcete-li povolit technologii IntelliSense pro nově přidané členy, otevřete v Průzkumník řešení místní nabídku pro projekt SampleComponent a pak zvolte Sestavit.
Odkazování na ukázkovou součást jazyka C# z projektu CppToCSharpWinRT
V Průzkumník řešeníu v projektu C++/WinRT otevřete místní nabídku položky Reference a potom zvolte Přidat odkaz. Tím otevřete dialogové okno Přidat odkaz. Zvolte Projekty a pak zvolte Řešení. Zaškrtněte políčko u projektu SampleComponent a zvolte OK a přidejte odkaz.
Note
Volitelné: Pokud chcete povolit IntelliSense pro projekt C++/WinRT, otevřete v Průzkumník řešení místní nabídku pro projekt CppToCSharpWinRT a pak zvolte Sestavit.
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 příkazů #include, poté přidejte pole winrt::SampleComponent::Example do struktury MainPage.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Note
Ve Visual Studiu je MainPage.h uveden pod MainPage.xaml.
Upravit MainPage.cpp
V MainPage.cpp změňte implementaci Mainpage::ClickHandler tak, aby volala metodu jazyka C# GetMyString.
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ýší.
Návod
V Visual Studio vytvořte projekt komponenty: V Průzkumník řešení otevřete místní nabídku pro projekt CppToCSharpWinRT a zvolte Vlastnosti a pak v části Vlastnosti konfigurace zvolte Ladění. Pokud chcete ladit kód C# (spravovaný) i C++ (nativní), nastavte typ ladicího programu na spravovaný a nativní .
Minimální verze aplikace
Minimální verze projektu jazyka C# řídí verzi .NET použitou ke kompilaci aplikace. Například výběr Windows 10 Fall Creators Update (10.0; Build 16299) nebo novější povolí podporu procesoru .NET Standard 2.0 a Windows Arm64.
Návod
Pokud není nutná podpora .NET Standard 2.0 nebo Arm64, doporučujeme použít minimální verzi aplikace nižší než 16299.
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ů.
V Visual Studio přejděte na Průzkumník řešení a otevřete místní nabídku pro projekt CppToCSharpWinRT. Zvolte Vlastnosti a nastavte verzi Universal aplikace pro Windows Min na Windows 10 Fall Creators Update (10.0; Build 16299) (nebo vyšší) Totéž proveďte u projektu SampleComponent .
V aplikaci Visual Studio otevřete místní nabídku pro projekt CppToCSharpWinRT a zvolením možnosti Uvolnit projekt 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 Visual Studio. Chcete-li je nastavit na správné hodnoty, otevřete %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages a podívejte se na podadresář pro každou hodnotu v níže uvedené tabulce. Adresář %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler bude obsahovat podadresář, který obsahuje nainstalovanou nativní verzi .NET, která začíná na 2.2. V níže uvedeném příkladu je to 2.2.12-rel-31116-00.
Proměnná MSBuild Adresář Příklad DotNetNativeVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler2.2.12-rel-31116-00DotNetNativeSharedLibrary %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.sharedlibrary2.2.8-rel-31116-00UWPCoreRuntimeSdkVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.UWPCoreRuntimeSdk2.2.14
Note
Pro Microsoft.Net.Native.SharedLibrary existuje několik podporovaných architektur. 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 .
Poté ihned za první PropertyGroup přidejte následující text (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)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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ím tagem Project, přidejte následující text beze změny.
<!-- Import all of the .NET Native / CoreCLR targets at the end of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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)' >= '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 Visual Studio. Provedete to tak, že v Průzkumníku řešení sady Visual Studio otevřete místní nabídku projektu CppToCSharpWinRT a zvolíte možnost Znovu načíst projekt.
Sestavení pro .NET Native
Doporučujeme sestavit a otestovat aplikaci s komponentou jazyka C# vytvořenou proti .NET nativní. V aplikaci Visual Studio otevřete místní nabídku projektu CppToCSharpWinRT a zvolením možnosti Uvolnit projekt otevřete CppToCSharpWinRT.vcxproj v textovém editoru.
Dále nastavte vlastnost UseDotNetNativeToolchain 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>
Příbuzná témata
Windows developer