Öğretici: CLR uygulamasına yerel bağımlılıkları yükleme

C++/CLI, .NET sınıflarını yerel C++ türleriyle birleştirerek C++ kodu alan kitaplıklar ve uygulamalar oluşturmanıza ve bunu .NET programlarına erişilebilir hale getirmenize olanak tanıyan bir teknolojidir.

Ortak Dil Çalışma Zamanı'nı (CLR) hedefleyen projelerinizde C++ bağımlılıklarını yüklemek ve kullanmak için vcpkg'yi C++/CLI ile birlikte kullanabilirsiniz.

Bu öğreticide şunların nasıl yapıldığını öğrenirsiniz:

Önkoşullar

Örnek C++/CLI oluşturma

Bu öğreticide, mevcut bir C++/CLI uygulamasından başlayacağız ve vcpkg ile yüklenmiş bir C++ bağımlı ekleyeceğiz. Bu öğreticideki komutlar, bunları Visual Studio için Geliştirici PowerShell'de çalıştırdığınızı varsayar.

1 - Örnek depoyu kopyalama

İlk adım, .NET örnekleri deposunda C++/CLI örnek uygulamasının bir kopyasını almaktır. C++/CLI örnek uygulaması klasöründe bulunur core/interop/cpp-cli .

git clone https://github.com/dotnet/samples

2 - Örnek uygulama klasörüne gidin

cd samples/core/interpo/cpp-cli

2 - Projenin doğru şekilde derlenip çalıştığını kontrol edin

Örnek depo dört proje içeren bir çözüm içerir:

  • ManagedLibrary: .NET için C# kitaplığı
  • MixedLibrary: ManagedLibrary'den yerel C++ kodu ve .NET kodunu karıştıran bir kitaplık
  • NativeApp: MixedLibrary'den .NET kodu kullanan bir C++ uygulaması
  • ManagedApp: MixedLibrary'den C++ kodu kullanan bir C# uygulaması

Çözümün projelerini oluşturmak için aşağıdaki komutu çalıştırın:

msbuild CPP-CLI.sln -restore

Derleme başarısız olursa, Önkoşullar bölümünde listelenen Visual Studio için gerekli bileşenleri yüklediğinizden ve örnek uygulamanın.NET 5.0 SDK veya üzeri ve Visual Studio 2019 16.8 veya sonraki sürümlerinin en düşük gereksinimlerini karşıladığınızdan emin olun.

Derledikten sonra ManagedApp.exe çalıştırabilirsiniz

./bin/Debug/x64/ManagedApp.exe

Program aşağıdaki çıkışı oluşturur:

=== Managed class ===
Hello from ManagedClass in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!

=== P/Invoke ===
Hello from NativeEntryPoint_CallNative in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!

3 - Projeyi Visual Studio'da açma

Sonraki adımlarda, konsola ileti yazdırmak için kullanılacak fmt kitaplığı değiştireceğiz. fmt kitaplığı vcpkg aracılığıyla kurulacak ve onu kullanan projelere bağlanacaktır.

Kaynak dosyaları düzenlemek için Visual Studio'da CPP-CLI.sln çözümünü açın:

start CPP-CLI.sln

Çözüm Visual Studio'da açıldıktan sonra projeyi en son sürümlere yeniden hedeflemeniz istenebilir. Windows SDK Sürümünü ve Platform Araç Takımı'nı en son sürüme yükseltmek için Tamam'a tıklayabilirsiniz.

Mevcut projeyi yeniden hedefleme

projenin hedef Windows SDK sürümünü ve Platform Araç Seti sürümünü en son sürüme

C++ yerel bağımlılığı ekleme

Daha sonra, MixedLibrary projesinde aşağıdaki değişiklikleri yapacağız.

  • fmt edinmek için bir vcpkg bildirimi ekleyin.
  • Projede vcpkg'yi etkinleştirin.
  • İletileri yazdırmak için fmt kullanacak şekilde NativeClass::Hello öğesini değiştirin.

1 - Vcpkg bildirimi oluşturma

NativeLibrary projesine sağ tıklayın ve bağlam menüsünde Yeni Öğe Ekle'ye > tıklayın.

Yeni öğeyi vcpkg.jsonadlandırın, bu vcpkg bildirim dosyasıdır ve dosyanın proje klasörünün kökünde oluşturulduğundan emin olun.

2 - fmt öğesini bağımlılık olarak ekleyin

vcpkg.json Dosyayı açın ve içeriğini aşağıdakiyle eşleşecek şekilde düzenleyin:

{
  "dependencies": [ "fmt" ]
}

vcpkg bildirim dosyası doğru konumda bulunuyorsa ve projeyi derlemeye çalışırsanız aşağıdaki uyarıyı alırsınız:

The vcpkg manifest was disabled, but we found a manifest file in samples\core\interop\cpp-cli\MixedLibrary\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation.

3 - MixedLibrary'nin özelliklerinde vcpkg'yi etkinleştirme

Projeye sağ tıklayıp Özellikler seçeneğine tıklayarak MixedLibrary'nin özellikler sayfasını açın.

vcpkg bölümünde aşağıdaki özellikleri değiştirin:

  • Vcpkg'yi kullan ayarı Evet olarak ayarlandı
  • Vcpkg Bildirimi'ni kullan ayarı Evet olarak ayarlandı
  • Instal Vcpkg Bağımlılıkları, Evet olarak ayarlandı
  • Otomatik Bağlantı'yı kullan ayarı Evet olarak ayarlandı
  • Uygulamanın yerel olarak dağıttığı DLL'ler Evet olarak ayarlandı

MixedLibrary proje özellikleri

vcpkg'yi etkinleştirmek için gereklidir

Bu değişikliklerle Visual Studio artık dosyayı okuyacak vcpkg.json ve projeyi oluşturmadan önce bildirimde yer alan bağımlılıkları otomatik olarak yükleyecektir.

Özellikler sayfasındayken, fmt öğesinin doğru şekilde derlenmesi için /utf-8 bayrağını da etkinleştirmek istiyoruz.

C/C++ ayarlarının Komut Satırı alt bölümünde, /utf-8 öğesini içerecek şekilde Ek Seçenekler'i düzenleyin

Son olarak, Özellikler sayfasını kapatmak için Tamam'a tıklayın.

4 - vcpkg'nin çalıştığını doğrulama

Her şey doğru yapılandırıldıysa Visual Studio, MixedLibrary projesini oluşturmadan önce bağımlılıklarınızı yüklemek için vcpkg'yi çağırır.

1>Installing vcpkg dependencies to  C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\vcpkg_installed\x64-windows\
1>"C:\path\to\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "C:\path\to\vcpkg\" "--x-manifest-root=C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\" "--x-install-root=C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\vcpkg_installed\x64-windows\"

vcpkg çıktısını görmüyorsanız veya fmt derlenemezse, > ifadesini C/C++ /utf-8 Komut Satırı'ndaki Ek Seçenekler'e eklemek de dahil olmak üzere yukarıdaki adımları doğru şekilde izlediğinizden emin olun.

4 - Projenin kaynak kodunu değiştirme

Son olarak, konsola mesaj yazdırmak için fmt kullanacak şekilde MixedLibrary.cpp dosyasını değiştirmek istiyoruz. Kaynak kodunda aşağıdaki değişiklikleri yapın:

1 - Üst bilgiyi ekleyin fmt/printf.h (5. satıra).

#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>

2 - NativeClass::Hello işlevini fmt::println kullanacak şekilde değiştirin (44. satırda).

void MixedLibrary::NativeClass::Hello(const wchar_t *msg)
{
    auto ws = std::wstring(msg);
    auto str = std::string(ws.length(), 0);
    std::transform(ws.begin(), ws.end(), std::back_inserter(str), [](wchar_t c) { return static_cast<char>(c); });
    fmt::println("Hello from NativeClass in MixedLibrary");
    fmt::println("-- message: {}", str);
    fmt::println("-- printed using FMT version {}", FMT_VERSION);
}

Uygulama oluşturma

İşlev, NativeClass::Hello C++ kodu kullanılarak konsola ileti yazdırmak için ManagedApp projesinde kullanılır. Yukarıdaki değişiklikler, fmt kitaplığının CLR uygulamasında kullanılmasını sağlar.

Uygulamanın projesinde herhangi bir değişiklik yapmanız gerekmez; yalnızca ManagedApp projesini derleyip çalıştırın.

Programın çıkışı şuna benzer görünmelidir:

=== Managed class ===
Hello from ManagedClass in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
-- printed using FMT version 110002

=== P/Invoke ===
Hello from NativeEntryPoint_CallNative in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
-- printed using FMT version 110002

Sonraki adımlar

Ayrıca diğer yararlı özellikler hakkında da bilgi edinin: