Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu başlığında C #/WinRT kullanarak C++/WinRT Windows Çalışma Zamanı bileşeninden C# .NET projeksiyonu (veya birlikte çalışma) derlemesi oluşturma ve bunu .NET uygulamaları için NuGet paketi olarak dağıtma adımlarını inceleyeceğiz.
.NET 6 ve sonraki sürümlerde Windows meta verileri (WinMD) dosyalarının kullanımı artık desteklenmiyor (bkz. WinRT için yerleşik destek .NET'ten kaldırılmıştır). Bunun yerine, C#/WinRT aracı herhangi bir WinMD dosyası için bir projeksiyon derlemesi oluşturmak için kullanılabilir ve bu da .NET uygulamalarından WinRT bileşenlerinin tüketilmesine olanak tanır. Projeksiyon derlemesi birlikte çalışma derlemesi olarak da bilinir. Bu izlenecek yol, aşağıdakileri nasıl yapacağınızı gösterir:
- C++/WinRT bileşeninden C# projeksiyonu oluşturmak için C#/WinRT paketini kullanın.
- Bileşeni projeksiyon derlemesiyle birlikte NuGet paketi olarak dağıtın.
- Bir .NET konsol uygulamasından NuGet paketini kullanın.
Önkoşullar
Bu izlenecek yol ve ilgili örnek için aşağıdaki araçlar ve bileşenler gerekir:
- Visual Studio 2022 (veya Visual Studio 2019) ile Evrensel Windows Platformu geliştirme iş yükü yüklü. Yükleme Ayrıntıları>Evrensel Windows Platformu geliştirme bölümünde C++ (v14x) Evrensel Windows Platformu araçları seçeneğini işaretleyin.
- .NET 6.0 SDK veya sonraki bir sürümü.
Yalnızca Visual Studio 2019. Visual Studio'da size C++/WinRT proje şablonları sağlayan C++/WinRT VSIX uzantısı. Proje şablonları Visual Studio 2022'de yerleşik olarak bulunur.
Bu kılavuzda Visual Studio 2022 ve .NET 6 kullanacağız.
Önemli
Ayrıca, GitHub'da C#/WinRT projeksiyon örneği bu konu için örnek kodu indirmeniz veya kopyalamanız gerekir.
CsWinRT'i ziyaret edin ve url'yi almak için yeşil git clone düğmesine tıklayın. Örneği incelemek için README.md dosyasını okuduğunuzdan emin olun.
Basit bir C++/WinRT Windows Çalışma Zamanı bileşeni oluşturma
Bu kılavuzu izlemek için öncelikle C# projeksiyon derlemesini oluşturabileceğiniz bir C++/WinRT Windows Çalışma Zamanı bileşenine (WRC) sahip olmanız gerekir.
Bu kılavuzda GitHub'da indirdiğiniz veya kopyaladığınız C#/WinRT projeksiyon örneğiSimpleMathComponent WRC kullanılır. SimpleMathComponent, Windows Çalışma Zamanı Bileşeni (C++/WinRT) Visual Studio proje şablonundan (ki Visual Studio 2022 ile veya C++/WinRT VSIX uzantısıbirlikte gelir) oluşturuldu.
SimpleMathComponent projesini Visual Studio'da açmak için, depoyu \CsWinRT\src\Samples\NetProjectionSample\CppWinRTComponentProjectionSample.sln indirmenizde veya kopyanızda bulabileceğiniz dosyayı açın.
Bu projedeki kod, aşağıdaki üst bilgi dosyasında gösterilen temel matematik işlemleri için işlevsellik sağlar.
// SimpleMath.h
...
namespace winrt::SimpleMathComponent::implementation
{
struct SimpleMath: SimpleMathT<SimpleMath>
{
SimpleMath() = default;
double add(double firstNumber, double secondNumber);
double subtract(double firstNumber, double secondNumber);
double multiply(double firstNumber, double secondNumber);
double divide(double firstNumber, double secondNumber);
};
}
Windows Desktop Compatible özelliğinin Evet olarak, SimpleMathComponent C++/WinRT Windows Çalışma Zamanı bileşen projesindeki ayarlandığını doğrulayabilirsiniz. Bunu yapmak için SimpleMathComponent proje özelliklerinde, Yapılandırma Özellikleri>Genel>Proje Varsayılanları'nın altında Windows Masaüstü Uyumlu özelliğini Evet olarak ayarlayın. Bu, .NET masaüstü uygulamalarının kullanılabilmesi için doğru çalışma zamanı bileşenlerinin yüklenmesini sağlar.
C++/WinRT bileşeni oluşturma ve WinMD dosyası oluşturma hakkında daha ayrıntılı adımlar için bkz. C++/WinRT ile Windows Çalışma Zamanı bileşenleri.
Uyarı
Bileşeninizde IInspectable::GetRuntimeClassName
Bileşen çözümüne projeksiyon projesi ekleme
İlk olarak, CppWinRTComponentProjectionSample çözümü Visual Studio'da hala açıkken, SimpleMathProjection projesini bu çözümden kaldırın. Ardından dosya sisteminizden SimpleMathProjection klasörünü silin (veya isterseniz yeniden adlandırın). Bu adımlar, bunları adım adım takip edebilmeniz için gereklidir.
Çözümünüz için yeni bir C# kitaplık projesi ekleyin.
- Çözüm Gezgini'nde, çözüm düğümünüze sağ tıklayın ve Ekle>Yeni Proje'yi seçin.
-
Yeni proje ekle iletişim kutusunda, arama kutusuna Sınıf Kitaplığı yazın. Dil listesinden C# öğesini ve ardından platform listesinden Windows'u seçin. Sadece
Sınıf Kitaplığı olarak adlandırılan (ön ekleri veya son ekleri olmadan) C# proje şablonunu seçin veİleri'ye tıklayın. - Yeni projeye SimpleMathProjection adını verin. Konum zaten
\CsWinRT\src\Samples\NetProjectionSampleklasörünün bulunduğu klasöre ayarlanmalıdır, ancak bunu onaylayın. Ardından İleri'ye tıklayın. - Ek Bilgiler sayfasında, .NET 6.0 (Uzun süreli destek)seçin ve ardından Oluşturseçin.
Taslak Class1.cs dosyasını projeden silin.
C#/WinRT NuGet paketini yüklemek için aşağıdaki adımları kullanın.
- Çözüm Gezgini'ndeSimpleMathProjection projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
- Gözat sekmesinde Microsoft.Windows.CsWinRT yazın veya arama kutusuna yapıştırın, arama sonuçlarında en son sürüme sahip öğeyi seçin ve ardından Yükle'ye tıklayarak paketi SimpleMathProjection projesine yükleyin.
SimpleMathProjection'a ekleyin SimpleMathComponent projesine bir proje başvurusu. Çözüm Gezgini'nde, SimpleMathProjection proje düğümünün altındaki Bağımlılıklar düğümüne sağ tıklayın, Proje Başvurusu Ekleöğesini seçin ve SimpleMathComponent projesini seçin. >Tamam.
Projeyi henüz oluşturmaya çalışmayın. Bunu daha sonraki bir adımda yapacağız.
Şimdiye kadar, Çözüm Gezgini şuna benzer bir görünüme sahip olmalıdır (sürüm numaralarınız farklı olacaktır).
Projeleri kaynak dışında oluşturma
Bu, CppWinRTComponentProjectionSample çözümü için zaten yapılandırılmış olsa da, yapılandırmayı kendiniz gerçekleştirme konusunda alıştırma yapmak için aşağıdaki adımları izleyin.
Çözümünüzü kaynaktan oluşturacak şekilde yapılandırmak için:
CppWinRTComponentProjectionSample çözümü hala açık durumdayken, çözüm düğümüne sağ tıklayın ve Ekle>Yeni Öğe'yi seçin. XML Dosyası öğesini seçin ve Directory.Build.props (uzantı olmadan) olarak
.xmladlandırın. Var olan dosyanın üzerine yazmak için Evet'e tıklayın.Directory.Build.props içeriğini aşağıdaki yapılandırmayla değiştirin.
<Project> <PropertyGroup> <BuildOutDir>$([MSBuild]::NormalizeDirectory('$(SolutionDir)', '_build', '$(Platform)', '$(Configuration)'))</BuildOutDir> <OutDir>$([MSBuild]::NormalizeDirectory('$(BuildOutDir)', '$(MSBuildProjectName)', 'bin'))</OutDir> <IntDir>$([MSBuild]::NormalizeDirectory('$(BuildOutDir)', '$(MSBuildProjectName)', 'obj'))</IntDir> </PropertyGroup> </Project>Directory.Build.props dosyasını kaydedin ve kapatın.
C#/WinRT yürütmek için proje dosyasını düzenleyin
Yansıtma derlemesini cswinrt.exe oluşturmak için aracı çağırabilmeniz için önce proje dosyasını birkaç proje özelliği belirtmek üzere düzenlemeniz gerekir.
Çözüm Gezgini'ndeSimpleMathProjection düğümüne çift tıklayarak proje dosyasını düzenleyicide açın.
TargetFrameworkbelirli bir Windows SDK sürümünü hedeflemek için öğesini güncelleştirin. Bu, birlikte çalışma ve projeksiyon desteği için gerekli olan derleme bağımlılıklarını ekler. Bu örnek, Windows SDK'sı net6.0-windows10.0.19041.0 sürümünü (Windows 10, sürüm 2004 olarak da bilinir) hedefler.Platformöğesini, sonuç proje derlemesi herhangi bir uygulama mimarisinden başvurulabilsin diye AnyCPU olarak ayarlayın. Başvuruda bulunan uygulamaların önceki Windows SDK sürümlerini desteklemesine izin vermek için özelliğini de ayarlayabilirsinizTargetPlatformMinimumVersion.<PropertyGroup> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> <!-- Set Platform to AnyCPU to allow consumption of the projection assembly from any architecture. --> <Platform>AnyCPU</Platform> </PropertyGroup>Uyarı
Bu kılavuz ve ilgili örnek kod için çözüm x64 ve Release için oluşturulmuş. SimpleMathProjection projesinin tüm çözüm mimarisi yapılandırmaları için AnyCPU için derlemek üzere yapılandırıldığını unutmayın.
Birkaç C#/WinRT özelliğini ayarlayan ikinci
PropertyGroupbir öğe (ilk öğeden hemen sonra) ekleyin.<PropertyGroup> <CsWinRTIncludes>SimpleMathComponent</CsWinRTIncludes> <CsWinRTGeneratedFilesDir>$(OutDir)</CsWinRTGeneratedFilesDir> </PropertyGroup>Bu örnekteki ayarlarla ilgili bazı ayrıntılar aşağıda verilmiştir:
-
CsWinRTIncludesözelliği, yansıtılan ad alanlarını belirtir. - özelliği,
CsWinRTGeneratedFilesDirprojeksiyon kaynak dosyalarının oluşturulduğu çıkış dizinini ayarlar. Bu özellik, yukarıdaki bölümdeOutDiriçinde tanımlanan olarak ayarlanır.
-
SimpleMathProjection.csproj dosyasını kaydedip
kapatın ve gerekirse projeleri yeniden için tıklayın.
Projeksiyon ile NuGet paketi oluşturma
.NET uygulama geliştiricileri için projeksiyon derlemesini dağıtmak için, bazı ek proje özellikleri ekleyerek çözümü oluştururken otomatik olarak bir NuGet paketi oluşturabilirsiniz. .NET hedefleri için NuGet paketinin projeksiyon derlemesini ve bileşenden uygulama derlemesini içermesi gerekir.
.nuspecprojesine NuGet belirtimi () dosyası eklemek için aşağıdaki adımları kullanın.- Çözüm Gezginiiçinde, SimpleMathProjection düğümüne sağ tıklayın, Ekle>Yeni Klasörseçimini yapın ve klasörü nugetolarak adlandırın.
nuget klasörüne sağ tıklayın, Yeni Öğe Ekleseçin, XML dosyasını seçin ve simpleMathProjection.nuspec adlandırın.
Çözüm Gezgini'ndeSimpleMathProjection düğümüne çift tıklayarak proje dosyasını düzenleyicide açın. Paketi otomatik olarak oluşturmak için şu anda açık olan SimpleMathProjection.csproj dosyasına (mevcut
PropertyGroupiki öğeden hemen sonra) aşağıdaki özellik grubunu ekleyin. Bu özellikler, NuGet paketini oluşturmak içinNuspecFileve dizini belirtir.<PropertyGroup> <GeneratedNugetDir>.\nuget\</GeneratedNugetDir> <NuspecFile>$(GeneratedNugetDir)SimpleMathProjection.nuspec</NuspecFile> <OutputPath>$(GeneratedNugetDir)</OutputPath> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup>Uyarı
Ayrı bir paket oluşturmayı tercih ediyorsanız, aracı komut satırından
nuget.exeçalıştırmayı da seçebilirsiniz. NuGet paketi oluşturma hakkında daha fazla bilgi için bkz. nuget.exe CLI kullanarak paket oluşturma.Paket oluşturma özelliklerini düzenlemek için SimpleMathProjection.nuspec dosyasını açın ve aşağıdaki kodu yapıştırın. Aşağıdaki kod parçacığı SimpleMathComponent'i birden çok hedef çerçeveye dağıtmak için örnek bir NuGet belirtimidir. hedef için SimpleMathComponent.winmd yerine
lib\net6.0-windows10.0.19041.0\SimpleMathProjection.dllprojeksiyon derlemesinin belirtildiğini unutmayın. Bu davranış .NET 6 ve sonraki sürümlerde yenidir ve C#/WinRT tarafından etkinleştirilir. uygulama derlemesi deSimpleMathComponent.dlldağıtılmalıdır ve çalışma zamanında yüklenecektir.<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <metadata> <id>SimpleMathComponent</id> <version>0.1.0-prerelease</version> <authors>Contoso Math Inc.</authors> <description>A simple component with basic math operations</description> <dependencies> <group targetFramework="net6.0-windows10.0.19041.0" /> <group targetFramework=".NETCoreApp3.0" /> <group targetFramework="UAP10.0" /> <group targetFramework=".NETFramework4.6" /> </dependencies> </metadata> <files> <!--Support .NET 6, .NET Core 3, UAP, .NET Framework 4.6, C++ --> <!--Architecture-neutral assemblies--> <file src="..\..\_build\AnyCPU\Release\SimpleMathProjection\bin\SimpleMathProjection.dll" target="lib\net6.0-windows10.0.19041.0\SimpleMathProjection.dll" /> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.winmd" target="lib\netcoreapp3.0\SimpleMathComponent.winmd" /> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.winmd" target="lib\uap10.0\SimpleMathComponent.winmd" /> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.winmd" target="lib\net46\SimpleMathComponent.winmd" /> <!--Architecture-specific implementation DLLs should be copied into RID-relative folders--> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.dll" target="runtimes\win10-x64\native\SimpleMathComponent.dll" /> <!--To support x86 and Arm64, build SimpleMathComponent for those other architectures and uncomment the entries below.--> <!--<file src="..\..\_build\Win32\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.dll" target="runtimes\win10-x86\native\SimpleMathComponent.dll" />--> <!--<file src="..\..\_build\arm64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.dll" target="runtimes\win10-arm64\native\SimpleMathComponent.dll" />--> </files> </package>Uyarı
SimpleMathComponent.dll, bileşenin uygulama derlemesi mimariye özgüdür. Diğer platformları destekliyorsanız (örneğin, x86 veya Arm64), önce istenen platformlar için SimpleMathComponent derlemeli ve bu derleme dosyalarını uygun RID göreli klasörüne eklemelisiniz. Projeksiyon derlemesiSimpleMathProjection.dll ve SimpleMathComponent.winmd bileşeni mimariden bağımsızdır.
Yeni düzenlediğiniz dosyaları kaydedin ve kapatın.
Projeksiyon ve NuGet paketini oluşturmak için çözümü oluşturma
Çözümü oluşturmadan önce Visual Studio'da Yapılandırma Yöneticisi ayarlarını Yapılandırma Yöneticisi'nin altında denetlediğinden emin olun.> Bu kılavuz için Yapılandırma'i Sürüm olarak ve Platform'i x64 olarak çözüm için ayarlayın.
Bu noktada artık çözümü oluşturabilirsiniz. Çözüm düğümünüze sağ tıklayın ve Çözümü Derle'i seçin. Bu, önce SimpleMathComponent projesini ve ardından SimpleMathProjection projesini oluşturur. Bileşen WinMD ve uygulama derlemesi (SimpleMathComponent.winmd ve SimpleMathComponent.dll), projeksiyon kaynak dosyaları ve projeksiyon derlemesi (SimpleMathProjection.dll), _build çıktı dizini altında oluşturulur. Ayrıca oluşturulan SimpleMathComponent0.1.0-prerelease.nupkg NuGet paketini \SimpleMathProjection\nuget klasörünün altında da görebilirsiniz.
Önemli
Yukarıda bahsedilen dosyalardan herhangi biri oluşturulmazsa çözümü ikinci kez derleyin. Yeniden derlemeden önce çözümü kapatıp yeniden açmanız da gerekebilir.
.nupkg, Visual Studio'da gösterildiği gibi görünmesi için çözümü kapatıp yeniden açmanız gerekebilir (veya Tüm Dosyaları Göster seçeneğinibelirleyip sonra bu seçeneği kaldırın).
Çözüm Gezgini
gösteriyor
C# .NET 6 konsol uygulamasında NuGet paketine başvurma
Bir .NET projesinden SimpleMathComponent'i kullanmak için, yeni bir .NET projesine önceki bölümde oluşturduğumuz SimpleMathComponent0.1.0-prerelease.nupkg NuGet paketine bir başvuru ekleyebilirsiniz. Aşağıdaki adımlar, ayrı bir çözümde basit bir Konsol uygulaması oluşturarak bunun nasıl yapılacağını gösterir.
C# Konsol Uygulaması projesi içeren yeni bir çözüm oluşturmak için aşağıdaki adımları kullanın (bu projeyi yeni bir çözümde oluşturmak SimpleMathComponent NuGet paketini bağımsız olarak geri yüklemenize olanak tanır).
Önemli
İndirdiğiniz veya C#/WinRT projeksiyon örneğinin kopyasında bulabileceğiniz bu yeni
\CsWinRT\src\Samples\NetProjectionSampleprojesini klasörün içinde oluşturacağız.- Visual Studio'nun yeni bir örneğinde Dosya>Yeni>Projeöğesini seçin.
- Yeni proje oluştur iletişim kutusunda Konsol Uygulaması proje şablonunu arayın. Sadece Konsol Uygulaması adlı C# proje şablonunu seçin (başka önek veya sonek olmadan) ve İleriöğesine tıklayın. Visual Studio 2019 kullanıyorsanız proje şablonu Konsol Uygulaması'dır.
- SampleConsoleApp
adını yeni projeye verin, konumunu SimpleMathComponent ve SimpleMathProjection klasörlerinin bulunduğu klasöre ayarlayın ve İleri'yi tıklayın. - Ek Bilgiler sayfasında, .NET 6.0 (Uzun süreli destek)seçin ve ardından Oluşturseçin.
Çözüm Gezgini'ndeSampleConsoleApp düğümüne çift tıklayarak SampleConsoleApp.csproj proje dosyasını açın ve ve
TargetFrameworközelliklerini aşağıdaki listede gösterildiği gibi görünecek şekilde düzenleyinPlatform.PlatformOrada değilse öğesini ekleyin.<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework> <Platform>x64</Platform> </PropertyGroup>SampleConsoleApp.csproj proje dosyası hala açıkken, SampleConsoleApp projesine simpleMathComponent NuGet paketine bir başvuru ekleyeceğiz. Projeyi oluştururken SimpleMathComponent NuGet'i geri yüklemek için, bileşen çözümünüzdeki
RestoreSourcesklasörünün yolu ile özelliğini kullanabilirsiniz. Aşağıdaki yapılandırmayı kopyalayın ve SampleConsoleApp.csproj dosyasına (öğesininProjectiçine) yapıştırın.<PropertyGroup> <RestoreSources> https://api.nuget.org/v3/index.json; ../SimpleMathProjection/nuget </RestoreSources> </PropertyGroup> <ItemGroup> <PackageReference Include="SimpleMathComponent" Version="0.1.0-prerelease" /> </ItemGroup>Önemli
RestoreSourcesYukarıda gösterilen SimpleMathComponent paketinin yolu olarak../SimpleMathProjection/nugetayarlanır. SimpleMathComponent ve SampleConsoleApp projelerinin aynı klasörde (NetProjectionSamplebu örnekte klasör) olması için bu kılavuzdaki adımları izlemeniz koşuluyla bu yol doğrudur. Farklı bir şey yaptıysanız bu yolu buna göre ayarlamanız gerekir. Alternatif olarak, çözümünüze yerel bir NuGet paket akışı ekleyebilirsiniz .SimpleMathComponent tarafından sağlanan işlevselliği kullanmak için Program.cs dosyasını düzenleyin.
var x = new SimpleMathComponent.SimpleMath(); Console.WriteLine("Adding 5.5 + 6.5 ..."); Console.WriteLine(x.add(5.5, 6.5).ToString());Yeni düzenlediğiniz dosyaları kaydedip kapatın ve konsol uygulamasını derleyip çalıştırın. Aşağıdaki çıkışı görmeniz gerekir.
Bilinen sorunlar
- Proje oluşturma sırasında şu tür bir hata görebilirsiniz: Hata MSB3271 "MSIL" oluşturulan projenin işlemci mimarisi ile "x86" adlı uygulama dosyasının işlemci mimarisi arasında bir uyuşmazlık oluştu ".. \SimpleMathComponent.winmd" için\SimpleMathComponent.dll"..". Bu uyuşmazlık çalışma zamanı hatalarına neden olabilir. İşlemci mimarilerini projenizle uygulama dosyanız arasında uyumlu hale getirmek için lütfen Configuration Manager aracılığıyla projenizin hedeflenen işlemci mimarisini değiştirmeyi düşünün veya projenizin hedeflenen işlemci mimarisiyle eşleşen işlemci mimarisine sahip bir uygulama dosyasıyla winmd dosyası seçin. Bu hatayı gidermek için C# kitaplık proje dosyanıza aşağıdaki özelliği ekleyin:
<PropertyGroup> <!-- Workaround for MSB3271 error on processor architecture mismatch --> <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch> </PropertyGroup>
Dikkat edilmesi gereken diğer noktalar
Bu konu başlığında nasıl oluşturulacağını gösterdiğimiz C# projeksiyonu (veya birlikte çalışma) derlemesi oldukça basittir; diğer bileşenlere bağımlılıkları yoktur. Ancak Windows Uygulama SDK'sı türlerine başvurular içeren bir C++/WinRT bileşeni için C# projeksiyonu oluşturmak için projeksiyon projesinde Windows Uygulama SDK'sı NuGet paketine bir başvuru eklemeniz gerekir. Bu tür başvurular eksikse "Tür <T> bulunamadı" gibi hatalar görürsünüz.
Bu konu başlığında yaptığımız bir diğer şey de projeksiyonu NuGet paketi olarak dağıtmaktır. Şu anda , gereklidir.
Kaynaklar
- Bu kılavuz için tam kod örneği
- C#/WinRT NuGet belgeleri
- NuGet.exe belgeleri
Windows developer