Leer en inglés

Compartir a través de


Tutorial: Instalación de dependencias nativas en una aplicación CLR

C++/CLI es una tecnología que permite combinar clases de .NET con tipos nativos de C++ para crear bibliotecas y aplicaciones que toman código de C++ y hacer que sea accesible para programas .NET.

Puede usar vcpkg en combinación con C++/CLI para instalar y consumir dependencias de C++ en los proyectos que tienen como destino Common Language Runtime (CLR).

En este tutorial, aprenderá a:

Requisitos previos

Compilación de un ejemplo de C++/CLI

En este tutorial, empezaremos desde una aplicación de C++/CLI existente y agregaremos una dependencia de C++ instalada con vcpkg. En los comandos de este tutorial se supone que los está ejecutando en powerShell para desarrolladores para Visual Studio.

1 - Clonación del repositorio de ejemplo

El primer paso es obtener una copia de la aplicación de ejemplo de C++/CLI en el repositorio de ejemplos de .NET. La aplicación de ejemplo de C++/CLI se encuentra en la core/interop/cpp-cli carpeta .

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

2 - Vaya a la carpeta de la aplicación de ejemplo

cd samples/core/interpo/cpp-cli

2 - Comprobación de que el proyecto se compila y se ejecuta correctamente

El repositorio de ejemplo contiene una solución con cuatro proyectos:

  • ManagedLibrary: una biblioteca de C# para .NET
  • MixedLibrary: una biblioteca que combina código nativo de C++ y código de .NET de ManagedLibrary
  • NativeApp: una aplicación de C++ que consume código .NET de MixedLibrary
  • ManagedApp: una aplicación de C# que consume código de C++ de MixedLibrary

Ejecute el siguiente comando para compilar los proyectos de la solución:

msbuild CPP-CLI.sln -restore

Si se produce un error en la compilación, asegúrese de que ha instalado los componentes necesarios para Visual Studio enumerados en la sección Requisitos previos y que cumple los requisitos mínimos del SDK de .NET 5.0 o posterior y Visual Studio 2019 16.8 o posterior] de la aplicación de ejemplo.

Una vez compilado, puede ejecutar ManagedApp.exe

./bin/Debug/x64/ManagedApp.exe

El programa produce el siguiente resultado:

=== 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- Abrir el proyecto en Visual Studio

En los pasos siguientes modificaremos la biblioteca que se usará fmt para imprimir mensajes en la consola. La fmt biblioteca se instalará a través de vcpkg y se vinculará en los proyectos de consumo.

Para editar los archivos de código fuente, abra la solución CPP-CLI.sln en Visual Studio:

start CPP-CLI.sln

Una vez que se haya abierto la solución en Visual Studio, puede obtener un mensaje para volver a dirigir el proyecto a las versiones más recientes. Puede hacer clic en Aceptar para actualizar la versión de Windows SDK y el conjunto de herramientas de plataforma a la versión más reciente.

Volver a establecer el proyecto existente

Versión de Windows SDK de destino y versión del conjunto de herramientas de plataforma del proyecto a la versión más reciente.

Adición de una dependencia nativa de C++

A continuación, realizaremos los siguientes cambios en el proyecto MixedLibrary.

  • Agregue un manifiesto vcpkg para adquirir fmt.
  • Habilite vcpkg en el proyecto.
  • Modifique el objeto NativeClass::Hello que se va a usar fmt para imprimir mensajes.

1 - Creación de un manifiesto vcpkg

Haga clic con el botón derecho en el proyecto NativeLibrary y haga clic en Agregar > nuevo elemento en el menú contextual.

Asigne al nuevo elemento vcpkg.jsonel nombre , este es el archivo de manifiesto vcpkg y asegúrese de que el archivo se crea en la raíz de la carpeta del proyecto.

2 - Agregar fmt como una depedencia

Abra el vcpkg.json archivo y edite su contenido para que coincida con lo siguiente:

{
  "dependencies": [ "fmt" ]
}

Si el archivo de manifiesto vcpkg se encuentra en la ubicación correcta e intenta compilar el proyecto, recibirá la siguiente advertencia:

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- Habilitar vcpkg en las propiedades de MixedLibrary

Abra la página de propiedades de MixedLibrary haciendo clic con el botón derecho en el proyecto y haciendo clic en la opción Propiedades.

Cambie las siguientes propiedades en la sección vcpkg:

  • Usar Vcpkg establecido en
  • Usar el manifiesto Vcpkg establecido en
  • Dependencias de Vcpkg instal establecidas en
  • Uso de AutoLink establecido en
  • Implementación local de archivos DLL de la aplicación establecida en

Propiedades del proyecto MixedLibrary

necesario para habilitar vcpkg

Con estos cambios, Visual Studio ahora leerá el vcpkg.json archivo e instalará automáticamente las dependencias contenidas en el manifiesto antes de compilar el proyecto.

Mientras se encuentra en la página Propiedades, también queremos habilitar la marca para que fmt se /utf-8 compile correctamente.

En la subsección Línea de comandos de la configuración de C/C++, edite las opciones adicionales que se van a incluir /utf-8 en .

Por último, haga clic en Aceptar para cerrar la página Propiedades.

4 - Comprobar que vcpkg funciona

Si todo está configurado correctamente, Visual Studio invocará vcpkg para instalar las dependencias antes de compilar el proyecto 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 no ve la salida de vcpkg o si fmt no se puede compilar, asegúrese de seguir los pasos anteriores correctamente, incluida la adición /utf-8 de las opciones adicionales en la línea de comandos de C/C++ > .

4 - Modificar el código fuente del proyecto

Por último, queremos modificar el MixedLibrary.cpp archivo que se va a usar fmt para imprimir mensajes en la consola. Realice los siguientes cambios en el código fuente:

1 - Incluir el encabezado (en la fmt/printf.h línea 5).

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

2 - Modificar la NativeClass::Hello función que se va a usar fmt::println (en la línea 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);
}

Compilar la aplicación

La NativeClass::Hello función se usa en el proyecto ManagedApp para imprimir un mensaje en la consola mediante código de C++. Los cambios anteriores lo hacen para que la fmt biblioteca se consuma en la aplicación CLR.

No se necesitan changs en el proyecto de la aplicación, solo tiene que compilar y ejecutar el proyecto managedApp.

La salida del programa debe ser similar a la siguiente:

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

Pasos siguientes

Obtenga información sobre otras características útiles: