İngilizce dilinde oku

Aracılığıyla paylaş


Öğ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 derlenip çalışmadığını denetleyin

Ö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 ile Visual Studio 2019 16.8 veya sonraki sürümlerinin] en düşük gereksinimlerini karşıladığınızdan emin olun.

Derledikten sonra ManagedApp.exe

./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. Kitaplık fmt vcpkg aracılığıyla yüklenir ve tüketen projelere bağlanı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

project'in hedef Windows SDK Sürümü ve Platform Araç Takımı sürümü en son sürüme.

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

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

  • almak fmtiçin bir vcpkg bildirimi ekleyin.
  • Projede vcpkg'yi etkinleştirin.
  • NativeClass::Hello İletileri yazdırmak için kullanılacak fmt şekilde 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 - Depedency olarak ekleme fmt

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, bayrağın /utf-8 doğru şekilde derlenebilmesini fmt sağlamak istiyoruz.

C/C++ ayarlarının Komut Satırı alt bölümünde,/utf-8

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 derleme başarısız olursafmt, C/C++ > Komut Satırı'nda Ek Seçenekler'e ekleme /utf-8 de dahil olmak üzere yukarıdaki adımları doğru izlediğinize emin olun.

4 - Projenin kaynak kodunu değiştirme

Son olarak, konsola MixedLibrary.cpp ileti yazdırmak için kullanılacak fmt dosyayı 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 - İşlevi NativeClass::Hello kullanılacak fmt::println ş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 kitaplığın fmt CLR uygulamasında tüketilmiş olmasını sağlar.

Uygulamanın projesinde hiçbir chang gerekli değildir, yalnızca ManagedApp projesini derleyin ve ç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: