Öğ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:
- vcpkg
- Git
- Visual Studio için Geliştirici PowerShell
- Aşağıdaki bileşenlere sahip Visual Studio :
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.
project'in hedef Windows SDK Sürümü ve Platform Araç Takımı sürümü en son sürüme.
Daha sonra, MixedLibrary projesinde aşağıdaki değişiklikleri yapacağız.
- almak
fmt
için bir vcpkg bildirimi ekleyin. - Projede vcpkg'yi etkinleştirin.
NativeClass::Hello
İletileri yazdırmak için kullanılacakfmt
ş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.json
adlandı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ı
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);
}
İş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
Ayrıca diğer yararlı özellikler hakkında da bilgi edinin:
vcpkg geri bildirimi
vcpkg, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: