Menulis komponen C# Windows Runtime untuk digunakan dari aplikasi C++/WinRT
Topik ini memancang Anda melalui proses penambahan komponen C# sederhana ke proyek C++/WinRT Anda.
Visual Studio memudahkan penulisan dan penyebaran jenis Windows Runtime kustom Anda sendiri di dalam proyek komponen Windows Runtime (WRC) yang ditulis dengan C# atau Visual Basic, lalu mereferensikan bahwa WRC dari proyek aplikasi C++, dan untuk menggunakan jenis kustom tersebut dari aplikasi tersebut.
Secara internal, jenis Windows Runtime Anda dapat menggunakan fungsionalitas .NET apa pun yang diizinkan dalam aplikasi UWP.
Catatan
Untuk informasi selengkapnya, lihat Komponen Windows Runtime dengan C# dan Visual Basic dan .NET untuk gambaran umum aplikasi UWP.
Secara eksternal, anggota jenis Anda hanya dapat mengekspos jenis Windows Runtime untuk parameter mereka dan mengembalikan nilai. Saat Anda membangun solusi, Visual Studio membangun proyek .NET WRC Anda, lalu menjalankan langkah build yang membuat file metadata Windows (.winmd). Ini adalah komponen Windows Runtime (WRC), yang disertakan Visual Studio di aplikasi Anda.
Catatan
.NET secara otomatis memetakan beberapa jenis .NET yang umum digunakan, seperti jenis data primitif dan jenis pengumpulan, ke windows Runtime yang setara. Jenis .NET ini dapat digunakan dalam antarmuka publik komponen Windows Runtime, dan akan muncul kepada pengguna komponen sebagai jenis Windows Runtime yang sesuai. Lihat Komponen Windows Runtime dengan C# dan Visual Basic.
Prasyarat
- Windows 10
- Microsoft Visual Studio.
Membuat Aplikasi Kosong
Di Visual Studio, buat proyek baru menggunakan templat proyek Blank App (C++/WinRT). Pastikan Anda menggunakan templat (C++/WinRT), dan bukan templat (Universal Windows).
Atur nama proyek baru ke CppToCSharpWinRT sehingga struktur folder Anda akan cocok dengan panduan.
Menambahkan Komponen Runtime C# Windows ke Solusi
Di Visual Studio, buat proyek komponen: Di Penjelajah Solusi, buka menu pintasan untuk solusi CppToCSharpWinRT dan pilih Tambahkan, lalu pilih Proyek Baru untuk menambahkan proyek C# baru ke solusi. Di bagian Templat terinstal dari kotak dialog Tambahkan Proyek Baru, pilih Visual C#, lalu pilih Windows, lalu Universal. Pilih templat Windows Runtime Component (Universal Windows) dan masukkan SampleComponent untuk nama proyek.
Catatan
Pada kotak dialog Proyek Platform Windows Universal Baru, pilih Pembaruan Pembuat Windows 10 (10.0; Bangun 15063) sebagai Versi Minimum. Silakan lihat bagian Versi Minimum Aplikasi di bawah ini untuk informasi lebih lanjut.
Menambahkan metode C# GetMyString
Dalam proyek SampleComponent, ubah nama kelas dari Class1 menjadi Contoh. Kemudian tambahkan dua anggota sederhana ke kelas , bidang privat int
dan metode instans bernama GetMyString:
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Catatan
Secara default, kelas ditandai disegel publik. Semua kelas Windows Runtime yang Anda ekspos dari komponen Anda harus disegel.
Catatan
Opsional: Untuk mengaktifkan IntelliSense untuk anggota yang baru ditambahkan, di Penjelajah Solusi, buka menu pintasan untuk proyek SampleComponent, lalu pilih Build.
Mereferensikan C# SampleComponent dari proyek CppToCSharpWinRT
Di Penjelajah Solusi, di proyek C++/WinRT, buka menu pintasan untuk Referensi, lalu pilih Tambahkan Referensi untuk membuka dialog Tambahkan Referensi. Pilih Proyek, lalu pilih Solusi. Pilih kotak centang untuk proyek SampleComponent dan pilih OK untuk menambahkan referensi.
Catatan
Opsional: Untuk mengaktifkan IntelliSense untuk proyek C++/WinRT, di Penjelajah Solusi, buka menu pintasan untuk proyek CppToCSharpWinRT, lalu pilih Bangun.
Edit MainPage.h
Buka MainPage.h
di proyek CppToCSharpWinRT lalu tambahkan dua item. Pertama tambahkan #include "winrt/SampleComponent.h"
di akhir #include
pernyataan, lalu winrt::SampleComponent::Example
bidang ke MainPage
struct.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Catatan
Di Visual Studio, MainPage.h
tercantum di bawah MainPage.xaml
.
Edit MainPage.cpp
Di MainPage.cpp
, ubah Mainpage::ClickHandler
implementasi untuk memanggil metode GetMyString
C# .
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
Jalankan proyek
Anda sekarang dapat membangun dan menjalankan proyek. Setiap kali Anda mengklik tombol, angka di tombol akan bertahap.
Tip
Di Visual Studio, buat proyek komponen: Di Penjelajah Solusi, buka menu pintasan untuk proyek CppToCSharpWinRT dan pilih Properti, lalu pilih Debugging di bawah Properti Konfigurasi. Atur Jenis Debugger ke Terkelola dan Asli jika Anda ingin men-debug kode C# (terkelola) dan C++ (asli).
Versi Minimum Aplikasi
Minimum Aplikasi dari versi proyek C# akan mengontrol versi .NET yang digunakan untuk mengkompilasi aplikasi. Misalnya, memilih Pembaruan Windows 10 Fall Creators (10.0; Build 16299) atau yang lebih baru akan mengaktifkan dukungan prosesor .NET Standard 2.0 dan Windows Arm64.
Tip
Sebaiknya gunakan versi Minimum Aplikasi yang lebih rendah dari 16299 untuk menghindari konfigurasi build tambahan jika dukungan .NET Standard 2.0 atau Arm64 tidak diperlukan.
Mengonfigurasi untuk Pembaruan Windows 10 Fall Creators (10.0; Build 16299)
Ikuti langkah-langkah ini untuk mengaktifkan dukungan .NET Standard 2.0 atau Windows Arm64 dalam proyek C# yang dirujuk dari proyek C++/WinRT Anda.
Di Visual Studio, buka Penjelajah Solusi dan buka menu pintasan untuk proyek CppToCSharpWinRT. Pilih Properti dan atur versi Universal Windows App Min ke Windows 10 Fall Creators Update (10.0; Build 16299) (atau lebih tinggi). Lakukan hal yang sama untuk proyek SampleComponent .
Di Visual Studio, buka menu pintasan untuk proyek CppToCSharpWinRT dan pilih Bongkar Proyek untuk dibuka CppToCSharpWinRT.vcxproj
di editor teks.
Salin dan tempel XML berikut ke xml pertama PropertyGroup
di 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 -->
Nilai untuk DotNetNativeVersion
, DotNetNativeSharedLibrary
, dan UWPCoreRuntimeSdkVersion
dapat bervariasi tergantung pada versi Visual Studio. Untuk mengaturnya ke nilai yang %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages
benar, buka dan lihat sub-direktori untuk setiap nilai dalam tabel di bawah ini. %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler
Direktori akan memiliki sub-direktori yang berisi versi .NET native terinstal yang dimulai dengan 2.2
. Dalam contoh di bawah ini, itu adalah 2.2.12-rel-31116-00
.
Variabel MSBuild Direktori Contoh 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
Catatan
Ada beberapa arsitektur yang didukung untuk Microsoft.Net.Native.SharedLibrary. Ganti x64
dengan arsitektur yang sesuai. Misalnya, arm64
arsitektur akan berada di %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary
direktori.
Selanjutnya, segera setelah yang pertama PropertyGroup
, tambahkan yang berikut ini (tidak diubah).
<!-- 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 -->
Di akhir file proyek, tepat sebelum tag penutup Project
, tambahkan yang berikut ini (tidak diubah).
<!-- 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 -->
Muat ulang file proyek di Visual Studio. Untuk melakukan ini, di Visual Studio Penjelajah Solusi, buka menu pintasan untuk proyek CppToCSharpWinRT dan pilih Muat Ulang Proyek.
Membangun untuk .NET Native
Disarankan untuk membangun dan menguji aplikasi Anda dengan komponen C# yang dibangun terhadap .NET native. Di Visual Studio, buka menu pintasan untuk proyek CppToCSharpWinRT dan pilih Bongkar Proyek untuk dibuka CppToCSharpWinRT.vcxproj
di editor teks.
Selanjutnya, atur UseDotNetNativeToolchain
properti ke true
dalam konfigurasi Rilis dan Arm64 dalam file proyek C++.
Di Penjelajah Solusi Visual Studio, buka menu pintasan untuk proyek CppToCSharpWinRT dan pilih Muat Ulang Proyek.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
Mereferensikan paket nuget C# lainnya
Jika komponen C# mereferensikan paket nuget lainnya, file proyek aplikasi mungkin memerlukan dependensi file daftar dari paket nuget sebagai konten penyebaran. Misalnya, jika komponen C# mereferensikan paket nuget Newtonsoft.Json, paket nuget dan dependensi file yang sama juga harus dirujuk dalam proyek aplikasi.
Dalam file SampleComponent.csproj, tambahkan referensi paket nuget:
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
Dalam proyek CppToCSharpWinRT, temukan file packages.config dan tambahkan referensi nuget yang sesuai. Ini akan menginstal paket nuget ke dalam folder paket solusi.
Dalam packages.config, tambahkan referensi paket nuget yang sama:
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
Kemudian tambahkan yang berikut ini ke file proyek aplikasi untuk mereferensikan dependensi file yang sesuai dari folder paket solusi. Misalnya, di CppToCSharpWinRT.vcxproj tambahkan yang berikut ini:
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk