Ler em inglês

Compartilhar via


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:

Pré-requisitos

Criar um exemplo de C++/CLI

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.

Redirecionar projeto existente

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.

Adicionar uma dependência nativa do C++

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 usar fmt 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

Propriedades do projeto MixedLibrary

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

Compilar o aplicativo

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

Próximas etapas

Saiba também sobre outros recursos úteis: