Lire en anglais

Partager via


Tutoriel : Installer des dépendances natives dans une application CLR

C++/CLI est une technologie qui vous permet de combiner des classes .NET avec des types C++ natifs pour créer des bibliothèques et des applications qui prennent du code C++ et la rendre accessible aux programmes .NET.

Vous pouvez utiliser vcpkg en combinaison avec C++/CLI pour installer et consommer des dépendances C++ dans vos projets ciblant le Common Language Runtime (CLR).

Dans ce didacticiel, vous apprendrez à :

Prérequis

Générer un exemple C++/CLI

Dans ce tutoriel, nous allons commencer à partir d’une application C++/CLI existante et ajouter une dépendance C++ installée avec vcpkg. Les commandes de ce didacticiel supposent que vous les exécutez dans un PowerShell développeur pour Visual Studio.

1 - Clonez l’exemple de dépôt

La première étape consiste à obtenir une copie de l’exemple d’application C++/CLI dans le référentiel d’exemples .NET. L’exemple d’application C++/CLI se trouve dans le core/interop/cpp-cli dossier.

git clone https://github.com/dotnet/samples

2 - Accédez à l’exemple de dossier d’application

cd samples/core/interpo/cpp-cli

2 - Vérifier que le projet génère et s’exécute correctement

L’exemple de référentiel contient une solution avec quatre projets :

  • ManagedLibrary : bibliothèque C# pour .NET
  • MixedLibrary : bibliothèque qui combine du code C++ natif et du code .NET à partir de ManagedLibrary
  • NativeApp : application C++ qui consomme du code .NET à partir de MixedLibrary
  • ManagedApp : application C# qui consomme du code C++ à partir de MixedLibrary

Exécutez la commande suivante pour générer les projets de la solution :

msbuild CPP-CLI.sln -restore

Si la build échoue, vérifiez que vous avez installé les composants requis pour Visual Studio répertoriés dans la section Conditions préalables , et que vous répondez à la configuration minimale requise du Kit de développement logiciel (SDK) .NET 5.0 ou version ultérieure et à Visual Studio 2019 16.8 ou version ultérieure] de l’exemple d’application.

Une fois généré, vous pouvez exécuter ManagedApp.exe

./bin/Debug/x64/ManagedApp.exe

Le programme génère la sortie suivante :

=== 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 - Ouvrir le projet dans Visual Studio

Dans les étapes suivantes, nous allons modifier la bibliothèque à utiliser fmt pour imprimer des messages dans la console. La fmt bibliothèque sera installée via vcpkg et liée dans les projets consommants.

Pour modifier les fichiers sources, ouvrez la solution CPP-CLI.sln dans Visual Studio :

start CPP-CLI.sln

Une fois la solution ouverte dans Visual Studio, vous pouvez recevoir une invite pour recibler le projet vers les dernières versions. Vous pouvez cliquer sur OK pour mettre à niveau la version du Kit de développement logiciel (SDK) Windows et l’ensemble d’outils de plateforme vers la dernière version.

Recibler un projet existant

version cible du Kit de développement logiciel (SDK) Windows et version de l’ensemble d’outils de plateforme du projet vers la dernière version.

Ajouter une dépendance native C++

Ensuite, nous allons apporter les modifications suivantes au projet MixedLibrary.

  • Ajoutez un manifeste vcpkg à acquérir fmt.
  • Activez vcpkg dans le projet.
  • Modifiez l’option NativeClass::Hello à utiliser fmt pour imprimer des messages.

1 - Créer un manifeste vcpkg

Cliquez avec le bouton droit sur le projet NativeLibrary, puis cliquez sur Ajouter un > nouvel élément dans le menu contextuel.

Nommez le nouvel élément vcpkg.json, il s’agit du fichier manifeste vcpkg et assurez-vous que le fichier est créé à la racine du dossier du projet.

2 - Ajouter fmt en tant que dépédité

Ouvrez le vcpkg.json fichier et modifiez son contenu pour qu’il corresponde à ce qui suit :

{
  "dependencies": [ "fmt" ]
}

Si le fichier manifeste vcpkg se trouve à l’emplacement approprié et que vous essayez de générer le projet, vous recevez l’avertissement suivant :

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 - Activer vcpkg dans les propriétés de MixedLibrary

Ouvrez la page des propriétés de MixedLibrary en cliquant avec le bouton droit sur le projet et en cliquant sur l’option Propriétés.

Modifiez les propriétés suivantes dans la section vcpkg :

  • Utiliser Vcpkg défini sur Oui
  • Utiliser le manifeste Vcpkg défini sur Oui
  • Dépendances Vcpkg instal définies sur Oui
  • Utiliser le lien automatique défini sur Oui
  • Déployer localement des DLL sur Oui

Propriétés du projet MixedLibrary

requis pour activer vcpkg

Avec ces modifications, Visual Studio lit désormais le vcpkg.json fichier et installe automatiquement les dépendances contenues dans le manifeste avant de générer le projet.

Dans la page Propriétés, nous souhaitons également permettre à l’indicateur /utf-8 de générer fmt correctement.

Dans la sous-section Ligne de commande des paramètres C/C++, modifiez les options supplémentaires à inclure /utf-8 dans le

Enfin, cliquez sur OK pour fermer la page Propriétés.

4 - Vérifier que vcpkg fonctionne

Si tout est correctement configuré, Visual Studio appelle vcpkg pour installer vos dépendances avant de générer le projet 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\"

Si vous ne voyez pas de sortie vcpkg ou si fmt vous ne parvenez pas à générer, vérifiez que vous avez suivi les étapes ci-dessus correctement, y compris l’ajout /utf-8 des options supplémentaires dans la ligne de commande C/C++ > .

4 - Modifier le code source du projet

Enfin, nous voulons modifier le MixedLibrary.cpp fichier à utiliser fmt pour imprimer des messages dans la console. Apportez les modifications suivantes au code source :

1 - Inclure l’en-tête (à la fmt/printf.h ligne 5).

#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>

2 - Modifier la fonction à utiliser fmt::println (à la NativeClass::Hello ligne 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);
}

Créer l’application

La NativeClass::Hello fonction est utilisée dans le projet ManagedApp pour imprimer un message dans la console à l’aide du code C++. Les modifications ci-dessus l’apportent afin que la fmt bibliothèque soit consommée dans l’application CLR.

Aucun changement n’est nécessaire pour le projet de l’application, il vous suffit de générer et d’exécuter le projet ManagedApp.

La sortie du programme doit ressembler à ceci :

=== 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

Étapes suivantes

Découvrez également d’autres fonctionnalités utiles :