Leggere in inglese

Condividi tramite


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:

Prerequisiti

Creare un esempio di C++/CLI

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.

Ridestinare il progetto esistente

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
  • Usare il manifesto Vcpkg impostato su
  • Dipendenze di Vcpkg instal impostate su
  • Usare AutoLink impostato su
  • Dll distribuite in locale app impostate su

Proprietà del progetto MixedLibrary

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);
}

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

Passaggi successivi

Altre informazioni su altre funzionalità utili: