Esercitazione: Installare dipendenze native in un'applicazione CLR
Articolo
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:
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.
Aggiungere una dipendenza nativa C++
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 utilizzare fmt 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.
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:
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);
}
Compilare l'applicazione
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
L'origine di questo contenuto è disponibile in GitHub, in cui è anche possibile creare ed esaminare i problemi e le richieste pull. Per ulteriori informazioni, vedere la guida per i collaboratori.
Feedback su vcpkg
vcpkg è un progetto di open source. Selezionare un collegamento per fornire feedback:
Come creare un progetto .NET, con informazioni su come aggiungere pacchetti e gestire le dipendenze dei pacchetti nel progetto. Usare l'interfaccia della riga di comando di .NET Core e il registro NuGet per aggiungere librerie e strumenti alle applicazioni C# tramite Visual Studio Code.