A partir do Visual Studio 2019, os projetos C++/CLI podem ter como destino o .NET. Esse suporte torna possível portar aplicativos da área de trabalho do Windows com camadas de interoperabilidade C++/CLI do .NET Framework para o .NET. Este artigo descreve como portar projetos C++/CLI do .NET Framework para o .NET.
Limitações do .NET Core do C++/CLI
Há algumas limitações importantes com projetos C++/CLI e .NET em comparação com o .NET Framework:
Não há suporte para a compilação de um projeto C++/CLI em um executável. Você deve compilar para uma DLL.
O suporte a C++/CLI para .NET é apenas Windows.
Projetos C++/CLI não podem ter como destino o .NET Standard.
Os projetos C++/CLI não suportam o formato de arquivo de projeto no estilo SDK mais recente. Em vez disso, os projetos C++/CLI usam o mesmo formato de arquivo .vcxproj que outros projetos do Visual Studio C++ usam.
Os projetos C++/CLI não podem ter como alvo várias plataformas .NET. Se você precisar criar um projeto C++/CLI para .NET e .NET Framework, use arquivos de projeto separados.
O .NET não suporta -clr:pure nem -clr:safe compilação, apenas a opção mais recente -clr:netcore (que é equivalente ao -clr .NET Framework).
Portar um projeto C++/CLI
Para portar um projeto C++/CLI para .NET, faça as seguintes alterações no arquivo .vcxproj . Essas etapas de migração diferem das etapas necessárias para outros tipos de projeto porque os projetos C++/CLI não usam arquivos de projeto no estilo SDK.
Substitua <CLRSupport>true</CLRSupport> as propriedades por <CLRSupport>NetCore</CLRSupport>. Essa propriedade geralmente está em grupos de propriedades específicos da configuração, portanto, talvez seja necessário substituí-la em vários locais.
Substitua <TargetFrameworkVersion> as propriedades por <TargetFramework>net8.0</TargetFramework>. Certifique-se de alterar a tag e o valor.
Remova todas as referências do .NET Framework a System, System.Data, System.Windows.Formse System.Xml, como <Reference Include="System" />. Os assemblies do SDK do .NET são referenciados automaticamente ao usar <CLRSupport>NetCore</CLRSupport>o .
Atualize o uso da API em arquivos .cpp, conforme necessário, para remover APIs indisponíveis para o .NET. Como os projetos C++/CLI tendem a ser camadas de interoperabilidade bastante finas, muitas vezes não são necessárias muitas alterações. Você pode usar o .NET Portability Analyzer para identificar APIs .NET sem suporte usadas por binários C++/CLI.
Se o seu projeto era um executável, execute as seguintes etapas:
Altere o tipo de projeto para uma biblioteca.
Crie um novo projeto executável .NET.
No projeto executável .NET, adicione referência à biblioteca .NET C++/CLI.
Uso do WPF e Windows Forms
Os projetos .NET C++/CLI podem usar APIs do Windows Forms e WPF. Para usar essas APIs da área de trabalho do Windows, você precisa adicionar referências explícitas de estrutura às bibliotecas da interface do usuário. Projetos no estilo SDK que usam APIs de área de trabalho do Windows fazem referência às bibliotecas de estrutura necessárias automaticamente usando o Microsoft.NET.Sdk.WindowsDesktop SDK. Como os projetos C++/CLI não usam o formato de projeto no estilo SDK, eles precisam adicionar referências explícitas de estrutura ao direcionar o .NET Core.
Para usar APIs do Windows Forms, adicione esta referência ao arquivo .vcxproj :
<!-- Reference all of Windows Forms -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
Para usar APIs do WPF, adicione esta referência ao arquivo .vcxproj :
<!-- Reference all of WPF -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" />
Para usar as APIs do Windows Forms e do WPF, adicione esta referência ao arquivo .vcxproj :
<!-- Reference the entirety of the Windows desktop framework:
Windows Forms, WPF, and the types that provide integration between them -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
Atualmente, não é possível adicionar essas referências usando o gerenciador de referência do Visual Studio. Em vez disso, atualize o arquivo de projeto editando-o manualmente. No Visual Studio, você precisa descarregar o projeto primeiro. Você também pode usar outro editor como Visual Studio Code.
Compilar sem MSBuild
Também é possível criar projetos C++/CLI sem usar MSBuild. Siga estas etapas para criar um projeto C++/CLI para .NET Core diretamente com cl.exe e link.exe:
Ao compilar, passe -clr:netcore para cl.exe.
Referenciar assemblies de referência .NET necessários.
Ao vincular, forneça o diretório de host do aplicativo .NET como um LibPath, para que ijwhost.lib possa ser encontrado.
Copie ijwhost.dll do diretório host do aplicativo .NET para o diretório de saída do projeto.
Verifique se existe um arquivo runtimeconfig.json para o primeiro componente do aplicativo que executa o código gerenciado. Para versões mais recentes do Visual Studio, um arquivo runtime.config é criado e copiado automaticamente.
Para versões mais antigas do Visual Studio, se o aplicativo tiver um ponto de entrada nativo, você precisará criar manualmente o seguinte arquivo de runtimeconfig.json para a primeira biblioteca C++/CLI a usar o tempo de execução do .NET. Se uma biblioteca C++/CLI for chamada de um ponto de entrada gerenciado, a biblioteca não precisará de um arquivo runtimeconfig.json , porque o assembly do ponto de entrada tem um que é usado ao iniciar o tempo de execução.
Os assemblies C++/CLI destinados ao .NET 7 ou a uma versão posterior são sempre carregados no padrão AssemblyLoadContext. No entanto, no .NET 6 e versões anteriores, assemblies C++/CLI podem ser carregados várias vezes, cada vez em um novo AssemblyLoadContext. Se a primeira vez que o código gerenciado em um assembly C++/CLI for executado:
É de um chamador nativo, o assembly é carregado em um arquivo .AssemblyLoadContext
É de um chamador gerenciado, o assembly é carregado no mesmo AssemblyLoadContext que o chamador, geralmente o padrão.
Para sempre carregar o assembly C++/CLI no padrão AssemblyLoadContext, você pode adicionar uma chamada de estilo "initialize" do assembly do ponto de entrada para o assembly C++/CLI. Para obter mais informações, consulte este problema dotnet/runtime.
Colabore connosco no GitHub
A origem deste conteúdo pode ser encontrada no GitHub, onde também pode criar e rever problemas e pedidos Pull. Para mais informações, consulte o nosso guia do contribuidor.
Comentários do .NET
O .NET é um projeto código aberto. Selecione um link para fornecer comentários:
O .NET é uma plataforma cruzada para programadores open source utilizada para criar diferentes tipos de aplicações. Com o .NET, pode utilizar múltiplas linguagens, editores e bibliotecas para criar conteúdos para a Web, dispositivos móveis, computadores, jogos e IoT.