Aracılığıyla paylaş


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.

Uyarı

Daha fazla bilgi için bkz. C# ve Visual Basic ile Windows Çalışma Zamanı bileşenlerini ve UWP uygulamaları için .NET'e genel bakış.

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 bir 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).

Uyarı

.NET, ilkel 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. Windows Çalışma Zamanı bileşenlerini C# ve Visual Basicile görün.

Önkoşullar

Boş Uygulama Oluşturma

Visual Studio'da Boş Uygulama (C++/WinRT) proje şablonunu kullanarak yeni bir proje oluşturun. (Evrensel Windows) 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'nde CppToCSharpWinRT çözümünün kısayol menüsünü açın, Ekle'yi seçin ve ardından çözüme yeni bir C# projesi eklemek için Yeni Proje'yi seçin. Yeni Proje Ekle iletişim kutusunun Yüklü Şablonlar bölümünde Visual C#'i seçin ve ardından Windows'i seçin ve evrensel. Windows Çalışma Zamanı Bileşeni (Evrensel Windows) şablonunu seçin ve proje adı olarak SampleComponent girin.

Uyarı

Yeni Evrensel Windows Platformu Projesi iletişim kutusunda, Minimum 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}";
        }
    }

Uyarı

Varsayılan olarak, sınıf genel mühürlüolarak işaretlenmiştir. Bileşeninizden kullanıma sunulan tüm Windows Çalışma Zamanı sınıflarıkorumalı olmalıdır.

Uyarı

İsteğe bağlı: Yeni eklenen üyeler için IntelliSense'i etkinleştirmek için Çözüm Gezgini'nde 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'nde, C++/WinRT projesinde, Başvurulariçin kısayol menüsünü açın ve ardından Başvuru Ekle seçeneğini seçerek Başvuru Ekle iletişim kutusunu açın. Projelerseçin ve ardından Çözümseçin. SampleComponent projesinin onay kutusunu seçin ve başvuru eklemek için tamam seçin.

Uyarı

İsteğe bağlı: C++/WinRT projesi için IntelliSense'i etkinleştirmek için Çözüm Gezgini'nde 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 "winrt/SampleComponent.h" deyimlerinin sonuna #include ekleyin, ardından winrt::SampleComponent::Example yapısına bir MainPage alan ekleyin.

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

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

Uyarı

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 ç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'ın C# bileşenine çağrı yapma ekran görüntüsü

Tavsiye

Visual Studio'da bileşen projesini oluşturun: Çözüm Gezgini'nde 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 Özelliklerini

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ştirecektir.

Tavsiye

.NET Standard 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'ne gidin ve CppToCSharpWinRT projesinin kısayol menüsünü açın. Özellikler seçin ve Evrensel Windows Uygulaması Min sürümünü Windows 10 Fall Creators Update (10.0; Derleme 16299) (veya üzeri). SampleComponent projesi için de aynısını yapın.

Visual Studio'da CppToCSharpWinRT projesinin kısayol menüsünü açın ve metin düzenleyicisinde açmak için CppToCSharpWinRT.vcxproj'ı seçin.

Aşağıdaki XML'i kopyalayıp ilk PropertyGroup'a CPPWinRTCSharpV2.vcxproj'de 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 -->

DotNetNativeVersion, DotNetNativeSharedLibrary ve UWPCoreRuntimeSdkVersion değerleri 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 dizininin, 2.2 ile başlayan yüklü bir .NET yerel sürümünü içeren bir alt dizini olacaktır. Aşağıdaki örnekte, bu 2.2.12-rel-31116-00'dır.

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

Uyarı

Microsoft.Net.Native.SharedLibrary için desteklenen birden çok mimari vardır. x64'ı uygun mimari ile 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'ın hemen sonrasında aşağıdakileri (değiştirilmeden) ekleyin.

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

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

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

.NET Native için derleme

Uygulamanızı .NET native'e göre oluşturulan C# bileşeniyle derlemeniz ve test etmek önerilir. Visual Studio'da CppToCSharpWinRT projesinin kısayol menüsünü açın ve metin düzenleyicisinde açmak için CppToCSharpWinRT.vcxproj'ı seçin.

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'nde CppToCSharpWinRT projesinin kısayol menüsünü açın ve Projeyi 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şvurusunu ekleyin:

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

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

packages.configiçinde, aynı NuGet paket referansını 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>