Como compilar um aplicativo .NET para código nativo?

88

Se eu quiser executar um aplicativo .NET em uma máquina onde o .NET framework não está disponível; Existe alguma maneira de compilar o aplicativo para código nativo?

Niyaz
fonte

Respostas:

45

A Microsoft tem um artigo que descreve como você pode compilar MSIL para código nativo

Você pode usar Ngen .

O Native Image Generator (Ngen.exe) é uma ferramenta que melhora o desempenho de aplicativos gerenciados. O Ngen.exe cria imagens nativas, que são arquivos contendo código de máquina específico do processador compilado, e os instala no cache de imagem nativa no computador local. O tempo de execução pode usar imagens nativas do cache em vez de usar o compilador just-in-time (JIT) para compilar o assembly original.

Infelizmente, você ainda precisa das bibliotecas do framework para executar seu programa. Não há nenhum recurso que eu conheça no SDK do MS .Net framework que permite que você compile todos os arquivos necessários em um único executável

Espo
fonte
1
Não encontro outra razão para usar isso além de performances. O código CLR ainda pode ser lido como antes e você ainda precisa do .NET. Decepcionante a Microsoft não ter fornecido uma ferramenta que consertasse o que considero um grande problema (qualquer pessoa pode ver seu código de alto nível como ele é)
MasterMastic
Não concordo com o Espo. Porque, o texto em cinza diz "Runtime", o que significa o CLR e, portanto, o .NET Framework que entra em cena conforme apontado corretamente por Chris. No entanto, o ponto NGen é verdadeiro. A questão é, sem usar CLR / Runtime / .NET Framework, todos são iguais.
Aluno de
1
É hora de ficar animado, entretanto, parece que o framework .net está finalmente recebendo um compilador nativo - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge seu executável .NET e tudo em sua árvore de dependências, então Ngen se você quiser um executável independente de .NET .
24

A RemoteSoft é uma ferramenta que compila um aplicativo .NET em um pacote que pode ser executado sem o .NET instalado. Não tenho nenhuma experiência com isso:

Salamandra RemoteSoft

Simon Steele
fonte
5
Essa é a única ferramenta de que já ouvi falar que faz isso sem precisar do framework. Claro, custa $ 1249.
Slapout
3
Tentei algumas vezes nos últimos anos, obter informações ou avaliações, mas eles nunca retornaram meus e-mails sobre preços ou demonstrações, então acho que o produto deles pode ser um pouco suspeito.
codenheim
21

Como algumas das outras respostas mencionadas aqui, você pode usar a ferramenta .NET Native para compilar seu aplicativo para o código de máquina nativo. Ao contrário dessas respostas, porém, explicarei como fazer isso.

Passos:

  1. Instale a ferramenta dotnet CLI (interface de linha de comando), que faz parte da nova cadeia de ferramentas do .NET Core. Usaremos isso para compilar nosso aplicativo; você pode encontrar um bom artigo sobre isso aqui.

  2. Abra um prompt de shell e cdpara o diretório do seu aplicativo.

  3. Digite isto:

    dotnet compile --native

É isso aí! Quando terminar, seu aplicativo será compilado em um único binário, assim:

EXE .NET Core compilado nativo

Será um executável autônomo; sem PDBs, assemblies ou arquivos de configuração incluídos (hooray!).


Como alternativa, se você quiser um programa ainda mais rápido, pode executar:

dotnet compile --native --cpp

Isso otimizará seu programa usando o gerador de código C ++ (em oposição ao RyuJIT), para que seu aplicativo seja ainda mais otimizado para cenários AOT.

Você pode encontrar mais informações sobre isso no repositório dotnet CLI GitHub .

James Ko
fonte
Observação: isso só é compatível com projetos criados com .NET Core. (Mas +1)
Mahmoud Al-Qudsi
Você esqueceu o detalhe muito importante de que o .NET Native requer o Windows 10.
Elmue
19

Eu testei vários deles e neste momento o único que suporta .NET 3.5 e também tem uma grande pilha de virtualização é o Xenocode Postbuild

Com o ngen, você ainda precisa ter o .NET framework instalado, mas usando uma ferramenta como tal, todo o seu código gerenciado é compilado em código nativo para que você possa implantá-lo em máquinas sem a presença do framework.

Erick Sgarbi
fonte
11

Sim, usando Ngen , o Native Image Generator. No entanto, há uma série de coisas que você precisa estar ciente:

  • Você ainda precisa do CLR para executar seu executável.
  • O CLR não otimizará dinamicamente suas montagens com base no ambiente em que é executado (por exemplo, 486 vs. 586 vs. 686, etc.)

Resumindo, só vale a pena usar o Ngen se você precisar reduzir o tempo de inicialização do seu aplicativo.

Chris Zwiryk
fonte
9

Você pode! No entanto, você está restrito ao .NET 1.1 (sem genéricos para você): Compilação Mono Ahead-Of-Time (AOT)

No entanto, isso significa que a compilação é realmente nativa, então você não será mais capaz de implantar um único conjunto de bytecode; você precisará de um por plataforma.

Ele foi projetado originalmente porque não há .NET ou Mono para iPhone, então foi assim que eles fizeram o MonoTouch.

Camilo Martin
fonte
6

Você pode fazer isso usando a nova tecnologia de pré-compilação chamada .NET Native. Confira aqui: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

Atualmente, está disponível apenas para aplicativos da Windows Store. Ele executa a vinculação de um único componente. Portanto, as bibliotecas do .NET Framework são vinculadas estaticamente ao seu aplicativo. Tudo é compilado em assemblies nativos e IL não são mais implantados. Os aplicativos não são executados no CLR, mas em um tempo de execução simplificado e otimizado chamado Managed Runtime (Mrt.dll)

Conforme declarado acima, a NGEN usou um modelo de compilação de mix e contou com IL e JIT para cenários dinâmicos. .NET Native não utiliza JIT, mas oferece suporte a vários cenários dinâmicos. Os autores de código precisariam utilizar diretivas de tempo de execução para fornecer dicas para o compilador .NET Native nos cenários dinâmicos que desejam oferecer suporte.

m_eric
fonte
1
+1 - Há anos espero que isso aconteça. Eu esperava que a paixão do mundo pela "Máquina Virtual" funcionasse mais cedo, mas, mesmo assim, está acontecendo. Espero que estejamos prestes a ver um ressurgimento da compilação nativa. Como você disse, no momento é para aplicativos da Windows Store, mas é apenas uma questão de tempo até que o mercado de desktop exija um tratamento igual.
codenheim
4

Você pode usar o ngen.exe para gerar uma imagem nativa, mas ainda terá que distribuir o código não nativo original também, e ele ainda precisa da estrutura instalada na máquina de destino.

O que não resolve seu problema, realmente.

Matt Bishop
fonte
2

Resposta de 2019: Use dotnet / corert . Ele pode compilar projetos .NET Core em .exearquivos autônomos . Sem dependências (exceto para bibliotecas de sistema como kernel32.dll). Aposto que é exatamente disso que o OP precisa.

Na página inicial do GitHub:

O compilador CoreRT pode compilar um aplicativo .NET Core gerenciado em um executável de arquivo único nativo (específico da arquitetura) fácil de implantar. Ele também pode produzir bibliotecas autônomas dinâmicas ou estáticas que podem ser consumidas por aplicativos escritos em outras linguagens de programação.

brk
fonte
1

A natureza do .NET é ser capaz de instalar aplicativos que foram compilados para MSIL e, em seguida, por JIT ou Ngen, MSIL é compilado para código nativo e armazenado localmente em um cache. Nunca se pretendeu gerar um verdadeiro .exe nativo que pudesse ser executado independentemente do .NET framework.

Talvez haja algum hack que faça isso, mas não parece seguro para mim. Existem muitas dinâmicas que requerem a estrutura, como: carregamento dinâmico de montagem, geração de código MSIL, etc.

Spoulson
fonte
0

O principal motivo para compilar em Native é proteger seus códigos, caso contrário, o MSIL compilado é como implantar os códigos-fonte na máquina do cliente.

NGEN compila em nativo, mas também precisa implantar códigos IL, essa finalidade é apenas reduzir o tempo de inicialização, mas também é inútil.

CoreRt é a versão alfa e funciona apenas com aplicativos simples do tipo helloworld.

.Net Core compila em arquivos executáveis ​​únicos, mas também não é exe nativo, é apenas um arquivo compactado de códigos IL e descompacta os códigos em uma pasta temporária durante a execução.

Minha pergunta simples da Microsoft é, se RyuJIT pode compilar IL em nativo durante a execução, por que não você pode compilar o mesmo IL com antecedência (AOT).

Rahim Surani
fonte
"CoreRt é a versão alfa e funciona apenas com aplicativos simples do tipo helloworld." Isso não é verdade - há jogos no Steam (por exemplo, street4rage.com ) que são mais complexos do que helloworld.
S Waye
Mas CoreRT não pode compilar nenhum aplicativo Winform. Encontrei outro compilador online que pode compilar o aplicativo Winform ( dotnetnative.online )
Rahim Surani
-1

tente isso ( http://www.dotnetnative.online/ ) para compilar exe compilado .net em exe nativo, eu tentei isso, é novo, mas bom.

Rahim Surani
fonte
Por favor, poste o conteúdo do link na resposta.
Russ J,
-3

Acho que não é possível. Você também precisará distribuir o .NET FW. Se você deseja compilar o aplicativo .NET em código nativo, use a ferramenta NGen

aku
fonte