Tutorial: Instalar dependências nativas em um aplicativo CLR
C++/CLI é uma tecnologia que permite combinar classes .NET com tipos C++ nativos para criar bibliotecas e aplicativos que usam código C++ e o tornam acessível a programas .NET.
Você pode usar o vcpkg em combinação com o C++/CLI para instalar e consumir dependências do C++ em seus projetos direcionados ao CLR (Common Language Runtime).
Neste tutorial, você aprenderá a:
- vcpkg
- Git
- Powershell do Desenvolvedor para Visual Studio
- Visual Studio com os seguintes componentes:
Neste tutorial, começaremos com um aplicativo C++/CLI existente e adicionaremos uma dependência C++ instalada com vcpkg. Os comandos neste tutorial pressupõem que você os esteja executando em um PowerShell de desenvolvedor para Visual Studio.
1 – Clonar o repositório de exemplo
A primeira etapa é obter uma cópia do aplicativo de exemplo C++/CLI no repositório de exemplos do .NET. O aplicativo de exemplo C++/CLI está localizado na core/interop/cpp-cli
pasta.
git clone https://github.com/dotnet/samples
2 – Navegue até a pasta do aplicativo de exemplo
cd samples/core/interpo/cpp-cli
2 - Verifique se o projeto é compilado e executado corretamente
O repositório de exemplo contém uma solução com quatro projetos:
- ManagedLibrary: uma biblioteca C# para .NET
- MixedLibrary: uma biblioteca que mistura código C++ nativo e código .NET de ManagedLibrary
- NativeApp: um aplicativo C++ que consome código .NET de MixedLibrary
- ManagedApp: um aplicativo C# que consome código C++ de MixedLibrary
Execute o seguinte comando para criar os projetos da solução:
msbuild CPP-CLI.sln -restore
Se o build falhar, verifique se você instalou os componentes necessários para o Visual Studio listados na seção Pré-requisitos e se atende aos requisitos mínimos do SDK do .NET 5.0 ou posterior e do Visual Studio 2019 16.8 ou posterior] do aplicativo de exemplo.
Depois de construído, você pode executar ManagedApp.exe
./bin/Debug/x64/ManagedApp.exe
O programa produz a seguinte saída:
=== 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 – Abra o projeto no Visual Studio
Nas próximas etapas, modificaremos a biblioteca a ser usada fmt
para imprimir mensagens no console. A fmt
biblioteca será instalada via vcpkg e vinculada nos projetos de consumo.
Para editar os arquivos de origem, abra a solução CPP-CLI.sln no Visual Studio:
start CPP-CLI.sln
Depois que a solução for aberta no Visual Studio, você poderá receber um prompt para redirecionar o projeto para as versões mais recentes. Você pode clicar em OK para atualizar a versão do SDK do Windows e o conjunto de ferramentas da plataforma para a mais recente.
Versão do SDK do Windows de destino do projeto e versão do conjunto de ferramentas da plataforma para a versão mais recente.
Em seguida, faremos as seguintes alterações no projeto MixedLibrary.
- Adicione um manifesto vcpkg para adquirir
fmt
. - Habilite vcpkg no projeto.
- Modifique o
NativeClass::Hello
para usarfmt
para imprimir mensagens.
1 - Criar um manifesto vcpkg
Clique com o botão direito do mouse no projeto NativeLibrary e clique em Adicionar > novo item no menu de contexto.
Nomeie o novo item vcpkg.json
, este é o arquivo de manifesto vcpkg e certifique-se de que o arquivo seja criado na raiz da pasta do projeto.
2 - Adicionar fmt
como uma dependência
Abra o vcpkg.json
arquivo e edite seu conteúdo para corresponder ao seguinte:
{
"dependencies": [ "fmt" ]
}
Se o arquivo de manifesto vcpkg estiver localizado no local correto e você tentar construir o projeto, receberá o seguinte aviso:
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 - Habilite vcpkg nas propriedades do MixedLibrary
Abra a página de propriedades do MixedLibrary clicando com o botão direito do mouse no projeto e clicando na opção Propriedades.
Altere as seguintes propriedades na seção vcpkg:
- Use Vcpkg definido como Sim
- Use o manifesto Vcpkg definido como Sim
- Instalar dependências do Vcpkg definidas como Sim
- Usar o AutoLink definido como Sim
- Implantar DLLs localmente no aplicativo definidas como Sim
Necessário para habilitar o vcpkg
Com essas alterações, o Visual Studio agora lerá o vcpkg.json
arquivo e instalará automaticamente as dependências contidas no manifesto antes de criar o projeto.
Enquanto estiver na página Propriedades, também queremos habilitar o /utf-8
sinalizador para fazer fmt
a compilação corretamente.
Na subseção Linha de Comando das configurações do C/C++, edite as Opções Adicionais a serem incluídas /utf-8
no
Por fim, clique em OK para fechar a página Propriedades.
4 - Verifique se o vcpkg está funcionando
Se tudo estiver configurado corretamente, o Visual Studio invocará vcpkg para instalar suas dependências antes de criar o projeto 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 você não vir a saída do vcpkg ou se fmt
falhar ao compilar, certifique-se de seguir as etapas acima corretamente, incluindo a adição /utf-8
de Opções Adicionais na Linha de Comando C/C++ > .
4 - Modifique o código-fonte do projeto
Por fim, queremos modificar o MixedLibrary.cpp
arquivo a ser usado fmt
para imprimir mensagens no console. Faça as seguintes alterações no código-fonte:
1 - Inclua o fmt/printf.h
cabeçalho (na linha 5).
#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>
2 - Modifique a NativeClass::Hello
função a utilizar fmt::println
(na linha 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);
}
A NativeClass::Hello
função é usada no projeto ManagedApp para imprimir uma mensagem no console usando código C++. As alterações acima fazem com que a fmt
biblioteca seja consumida no aplicativo CLR.
Não são necessárias alterações no projeto do aplicativo, basta criar e executar o projeto ManagedApp.
A saída do programa deve ser semelhante a esta:
=== 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
Saiba também sobre outros recursos úteis:
Comentários do vcpkg
O vcpkg é um projeto código aberto. Selecione um link para fornecer comentários: