Esercitazione: Installare dipendenze native in un'applicazione CLR
C++/CLI è una tecnologia che consente di combinare classi .NET con tipi C++ nativi per creare librerie e applicazioni che accettano codice C++ e renderle accessibili ai programmi .NET.
È possibile usare vcpkg in combinazione con C++/CLI per installare e usare le dipendenze C++ nei progetti destinati a Common Language Runtime (CLR).
La presente esercitazione include informazioni su come:
- vcpkg
- Git
- PowerShell per sviluppatori per Visual Studio
- Visual Studio con i componenti seguenti:
In questa esercitazione si inizierà da un'applicazione C++/CLI esistente e si aggiungerà un C++ dependeny installato con vcpkg. I comandi di questa esercitazione presuppongono che vengano eseguiti in uno sviluppatore di PowerShell per Visual Studio.
1 - Clonare il repository di esempio
Il primo passaggio consiste nel ottenere una copia dell'applicazione di esempio C++/CLI nel repository di esempi .NET. L'applicazione di esempio C++/CLI si trova nella core/interop/cpp-cli
cartella .
git clone https://github.com/dotnet/samples
2 - Passare alla cartella dell'applicazione di esempio
cd samples/core/interpo/cpp-cli
2 - Verificare che il progetto venga compilato ed eseguito correttamente
Il repository di esempio contiene una soluzione con quattro progetti:
- ManagedLibrary: libreria C# per .NET
- MixedLibrary: libreria che combina codice C++ nativo e codice .NET da ManagedLibrary
- NativeApp: applicazione C++ che usa codice .NET da MixedLibrary
- ManagedApp: un'applicazione C# che usa codice C++ da MixedLibrary
Eseguire il comando seguente per compilare i progetti della soluzione:
msbuild CPP-CLI.sln -restore
Se la compilazione non riesce, assicurarsi di aver installato i componenti necessari per Visual Studio elencati nella sezione Prerequisiti e di soddisfare i requisiti minimi di .NET 5.0 SDK o versioni successive e Visual Studio 2019 16.8 o versioni successive dell'applicazione di esempio.
Dopo la compilazione, è possibile eseguire ManagedApp.exe
./bin/Debug/x64/ManagedApp.exe
Il programma produce l'output seguente:
=== 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 - Aprire il progetto in Visual Studio
Nei passaggi successivi verrà modificata la libreria da usare fmt
per stampare i messaggi nella console. La fmt
libreria verrà installata tramite vcpkg e collegata nei progetti di utilizzo.
Per modificare i file di origine, aprire la soluzione CPP-CLI.sln in Visual Studio:
start CPP-CLI.sln
Dopo aver aperto la soluzione in Visual Studio, è possibile che venga visualizzato un prompt per riassegnare il progetto alle versioni più recenti. È possibile fare clic su OK per aggiornare la versione di Windows SDK e il set di strumenti della piattaforma alla versione più recente.
Versione del progetto di destinazione di Windows SDK e versione del set di strumenti della piattaforma alla versione più recente.
Successivamente, verranno apportate le modifiche seguenti al progetto MixedLibrary.
- Aggiungere un manifesto vcpkg per acquisire
fmt
. - Abilitare vcpkg nel progetto.
- Modificare l'oggetto
NativeClass::Hello
da utilizzarefmt
per stampare i messaggi.
1 - Creare un manifesto vcpkg
Fare clic con il pulsante destro del mouse sul progetto NativeLibrary e scegliere Aggiungi > nuovo elemento nel menu di scelta rapida.
Denominare il nuovo elemento vcpkg.json
, si tratta del file manifesto vcpkg e assicurarsi che il file venga creato nella radice della cartella del progetto.
2 - Aggiungere fmt
come depedency
Aprire il file e modificarne il vcpkg.json
contenuto in modo che corrisponda al seguente:
{
"dependencies": [ "fmt" ]
}
Se il file manifesto vcpkg si trova nel percorso corretto e si tenta di compilare il progetto, verrà visualizzato l'avviso seguente:
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 - Abilitare vcpkg nelle proprietà di MixedLibrary
Aprire la pagina delle proprietà di MixedLibrary facendo clic con il pulsante destro del mouse sul progetto e scegliendo l'opzione Proprietà.
Modificare le proprietà seguenti nella sezione vcpkg:
- Usare Vcpkg impostato su Sì
- Usare il manifesto Vcpkg impostato su Sì
- Dipendenze di Vcpkg instal impostate su Sì
- Usare AutoLink impostato su Sì
- Dll distribuite in locale app impostate su Sì
necessario per abilitare vcpkg
Con queste modifiche Visual Studio leggerà ora il vcpkg.json
file e installerà automaticamente le dipendenze contenute nel manifesto prima di compilare il progetto.
Anche se nella pagina Proprietà si vuole abilitare il /utf-8
flag per la fmt
corretta compilazione.
Nella sottosezione riga di comando delle impostazioni C/C++ modificare le opzioni aggiuntive da includere /utf-8
in
Infine, fare clic su OK per chiudere la pagina Proprietà.
4 - Verificare che vcpkg funzioni
Se tutto è configurato correttamente, Visual Studio richiamerà vcpkg per installare le dipendenze prima di compilare il progetto MixedLibrary.
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\"
Se non viene visualizzato l'output vcpkg o se fmt
non si riesce a compilare, assicurarsi di aver seguito correttamente i passaggi precedenti, inclusa l'aggiunta /utf-8
nella riga di comando opzioni aggiuntive in C/C++ > .
4 - Modificare il codice sorgente del progetto
Infine, si vuole modificare il MixedLibrary.cpp
file da usare fmt
per stampare i messaggi nella console. Apportare le modifiche seguenti al codice sorgente:
1 - Includere l'intestazione fmt/printf.h
(nella riga 5).
#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>
2 - Modificare la NativeClass::Hello
funzione da usare fmt::println
(alla riga 44).
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);
}
La NativeClass::Hello
funzione viene usata nel progetto ManagedApp per stampare un messaggio nella console usando codice C++. Le modifiche precedenti lo rendono in modo che la fmt
libreria venga utilizzata nell'applicazione CLR.
Non è necessario cambiare il progetto dell'applicazione, è sufficiente compilare ed eseguire il progetto ManagedApp.
L'output del programma dovrebbe essere simile al seguente:
=== 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
Altre informazioni su altre funzionalità utili:
Feedback su vcpkg
vcpkg è un progetto di open source. Selezionare un collegamento per fornire feedback: