C++/WinRT uygulamasından kullanmak üzere C# Windows Çalışma Zamanı bileşeni yazma

Bu konu, C++/WinRT projenize basit bir C# bileşeni ekleme işleminde size yol gösterir.

Visual Studio, C# veya Visual Basic ile yazılmış bir Windows Çalışma Zamanı bileşeni (WRC) projesinde kendi özel Windows Çalışma Zamanı türlerinizi yazmayı ve dağıtmayı ve ardından bir C++ uygulama projesinden bu WRC'ye başvurmayı ve bu uygulamadan bu özel türleri tüketmeyi kolaylaştırır.

dahili olarak, Windows Çalışma Zamanı türleriniz bir UWP uygulamasında izin verilen tüm .NET işlevlerini kullanabilir.

Harici olarak, türünüzün üyeleri parametreleri ve dönüş değerleri için yalnızca Windows Çalışma Zamanı türlerini kullanıma açabilir. Çözümünüzü oluşturduğunuzda, Visual Studio .NET WRC projenizi oluşturur ve ardından Windows meta verileri (.winmd) dosyası oluşturan bir derleme adımı yürütür. Bu, Visual Studio’nun uygulamanıza dahil ettiği Windows Çalışma Zamanı bileşeninizdir (WRC).

Note

.NET, temel veri türleri ve koleksiyon türleri gibi yaygın olarak kullanılan bazı .NET türlerini Windows Çalışma Zamanı eşdeğerleriyle otomatik olarak eşler. Bu .NET türleri bir Windows Çalışma Zamanı bileşeninin ortak arabiriminde kullanılabilir ve ilgili Windows Çalışma Zamanı türleri olarak bileşenin kullanıcılarına görünür. Bkz. C# ve Visual Basic ile Windows Çalışma Zamanı bileşenleri.

Prerequisites

Boş Uygulama Oluşturma

Visual Studio'de Boş Uygulama (C++/WinRT) proje şablonunu kullanarak yeni bir proje oluşturun (WinUI 3 masaüstü uygulamaları için Boş Uygulama, Paketlenmiş (Masaüstünde WinUI 3) şablonunu kullanın). (Evrensel Windows) şablonunu değil , (C++/WinRT) şablonunu kullandığınızdan emin olun.

Klasör yapınızın kılavuzla eşleşmesi için yeni projenin adını CppToCSharpWinRT olarak ayarlayın.

Çözüme C# Windows Çalışma Zamanı Bileşeni Ekleme

Visual Studio’da bileşen projesini oluşturun: Çözüm Gezgini’da, CppToCSharpWinRT çözümünün kısayol menüsünü açın ve çözüme yeni bir C# projesi eklemek için Ekle’yi, ardından Yeni Proje’yi seçin. Yeni Project Ekle iletişim kutusunun Yüklü Şablonlar bölümünde Visual C# öğesini ve ardından Windows ve ardından Evrensel'i seçin. Windows Çalışma Zamanı Bileşeni (Evrensel Windows) şablonunu seçin ve proje adı olarak SampleComponent girin.

Note

Yeni Evrensel Windows Platformu Projesi iletişim kutusunda, En Düşük Sürüm olarak Windows 10 Creators Update (10.0; Derleme 15063) seçin. Daha fazla bilgi için lütfen aşağıdaki Uygulama En Düşük Sürümü bölümüne bakın.

C# GetMyString yöntemini ekleme

SampleComponent projesinde sınıfın adını Sınıf1 yerine Örnek olarak değiştirin. Ardından sınıfına iki basit üye ekleyin: özel int bir alan ve GetMyString adlı bir örnek yöntemi:

    public sealed class Example
    {
        int MyNumber;

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

Note

Varsayılan olarak, sınıf ortak korumalı olarak işaretlenir. Bileşeninizden kullanıma sunduğunuz tüm Windows Çalışma Zamanı sınıfları mühürlü olmalıdır.

Note

İsteğe bağlı: Yeni eklenen üyeler için IntelliSense'i etkinleştirmek için Çözüm Gezgini SampleComponent projesinin kısayol menüsünü açın ve oluştur'u seçin.

CppToCSharpWinRT projesinden C# SampleComponent'e başvurun

Çözüm Gezgini,C++/WinRT projesinde Başvurular kısayol menüsünü açın ve başvuru ekle iletişim kutusunu açmak için Başvuru Ekle'yi seçin. Projeler'i ve ardından Çözüm'e tıklayın. SampleComponent projesinin onay kutusunu seçin ve başvuru eklemek için Tamam'ı seçin.

Note

İsteğe bağlı: C++/WinRT projesinde IntelliSense'i etkinleştirmek için Çözüm Gezgini CppToCSharpWinRT projesinin kısayol menüsünü açın ve ardından Oluştur'u seçin.

MainPage.h dosyasını düzenle

MainPage.h projesinde açın ve iki öğe ekleyin. İlk olarak #include ifadelerinin sonuna #include "winrt/SampleComponent.h" ekleyin, ardından MainPage yapısına bir winrt::SampleComponent::Example alanı ekleyin.

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

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

Note

Visual Studio’da MainPage.h, MainPage.xaml altında listelenir.

MainPage.cpp Düzenle

MainPage.cpp içinde, Mainpage::ClickHandler uygulamasını C# yöntemi GetMyString'yi çağıracak şekilde değiştirin.

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

    hstring myString = myExample.GetMyString();

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

Projeyi çalıştırma

Artık projeyi derleyebilir ve çalıştırabilirsiniz. Düğmeye her tıkladığınızda, düğmedeki sayı artar.

C++/WinRT Windows C# bileşeni ekran görüntüsüne çağrı yapıyor

Tavsiye

Visual Studio bileşen projesini oluşturun: Çözüm Gezgini'da CppToCSharpWinRT projesinin kısayol menüsünü açın, Özellikler'i ve ardından Yapılandırma Özellikleri'nin altında Hata Ayıklama'yı seçin. Hem C# (yönetilen) hem de C++ (yerel) kodunda hata ayıklamak istiyorsanız Hata Ayıklayıcı Türü'nü Yönetilen ve Yerel olarak ayarlayın. C++ Hata Ayıklama Özellikleri

Uygulama En Düşük Sürümü

C# proje sürümünün Application Minimum değeri, uygulamayı derlemek için kullanılan .NET sürümünü denetler. Örneğin Windows 10 Fall Creators Update (10.0; Derleme 16299) veya üzeri, .NET Standard 2.0 ve Windows Arm64 işlemci desteğini etkinleştirir.

Tavsiye

.NET Standart 2.0 veya Arm64 desteği gerekli değilse ek derleme yapılandırmasından kaçınmak için 16299'dan düşük Uygulama Minimum sürümlerini kullanmanızı öneririz.

Windows 10 Fall Creators Update (10.0; Derleme 16299) için yapılandırın

C++/WinRT projenizden başvuruda bulunan C# projelerinde .NET Standard 2.0 veya Windows Arm64 desteğini etkinleştirmek için bu adımları izleyin.

Visual Studio'da Çözüm Gezgini gidin ve CppToCSharpWinRT projesinin kısayol menüsünü açın. Özellikler'i seçin ve Universal Windows Uygulaması en düşük sürümünü Windows 10 Fall Creators Update (10.0; Derleme 16299) (veya daha yüksek) olarak ayarlayın. SampleComponent projesi için de aynısını yapın.

Visual Studio’da, CppToCSharpWinRT projesinin kısayol menüsünü açın ve CppToCSharpWinRT.vcxproj öğesini metin düzenleyicisinde açmak için Projeyi Kaldır seçeneğini belirleyin.

Aşağıdaki XML’yi kopyalayıp CPPWinRTCSharpV2.vcxproj içindeki ilk PropertyGroup öğesine yapıştırın.

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

, DotNetNativeVersionve DotNetNativeSharedLibrary değerleriUWPCoreRuntimeSdkVersion, Visual Studio sürümüne bağlı olarak değişebilir. Bunları doğru değerlere ayarlamak için öğesini açın %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages ve aşağıdaki tabloda yer alan her değerin alt dizinine bakın. %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler dizini, 2.2 ile başlayan yüklü bir yerel .NET sürümünü içeren bir alt dizine sahip olacaktır. Aşağıdaki örnekte, şeklindedir 2.2.12-rel-31116-00.

MSBuild Değişkeni Dizin Örnek
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

Microsoft.Net.Native.SharedLibrary için desteklenen birden çok mimari vardır. x64 öğesini uygun mimariyle değiştirin. Örneğin, arm64 mimarisi %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary dizininde olacaktır.

Ardından, ilk PropertyGroupöğesinin hemen arkasına aşağıdakileri ekleyin (değiştirilmedi).

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

project dosyasının sonuna, kapanış Project etiketinden hemen önce aşağıdakileri ekleyin (değiştirilmedi).

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

proje dosyasını Visual Studio'de yeniden yükleyin. Bunu yapmak için Visual Studio Çözüm Gezgini CppToCSharpWinRT project kısayol menüsünü açın ve Project Yeniden Yükle'yi seçin.

.NET Native için geliştirme

Uygulamanızı yerel .NET karşı oluşturulan C# bileşeniyle derlemeniz ve test etmek önerilir. Visual Studio’da, CppToCSharpWinRT projesinin kısayol menüsünü açın ve CppToCSharpWinRT.vcxproj öğesini metin düzenleyicisinde açmak için Unload Project seçeneğini belirleyin.

Ardından, C++ proje dosyasındaki Release ve Arm64 yapılandırmalarında UseDotNetNativeToolchain özelliğini true olarak ayarlayın.

Visual Studio Çözüm Gezgini CppToCSharpWinRT project kısayol menüsünü açın ve Project Yeniden Yükle'yi seçin.

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

Diğer C# nuget paketlerine başvurma

C# bileşeni diğer nuget paketlerine başvuruyorsa, uygulamanın proje dosyasında nuget paketinden dağıtım içeriği olarak liste dosyası bağımlılıkları gerekebilir. Örneğin, C# bileşeni Newtonsoft.Json nuget paketine başvuruyorsa, uygulama projesinde aynı nuget paketine ve dosya bağımlılığına da başvurulmalıdır.

SampleComponent.csproj dosyasına nuget paket başvuruyu ekleyin:

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

CppToCSharpWinRT projesinde packages.config dosyasını bulun ve uygun nuget başvuruyu ekleyin. Bu işlem, nuget paketini çözümün paket klasörüne yükler.

packages.config içine aynı NuGet paket başvurusunu ekleyin:

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

Ardından, çözümün paket klasöründen uygun dosya bağımlılığına başvurmak için aşağıdakini uygulama projesi dosyasına ekleyin. Örneğin, CppToCSharpWinRT.vcxproj aşağıdakileri ekleyin:

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