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:
- vcpkg
- Git
- PowerShell para desarrolladores para Visual Studio
- Visual Studio con los siguientes componentes:
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.
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.
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 usarfmt
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.json
el 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 Sí
- Usar el manifiesto Vcpkg establecido en Sí
- Dependencias de Vcpkg instal establecidas en Sí
- Uso de AutoLink establecido en Sí
- Implementación local de archivos DLL de la aplicación establecida en Sí
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);
}
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
Obtenga información sobre otras características útiles:
Comentarios de vcpkg
vcpkg es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios: