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?
Respostas:
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
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:
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:
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.
Abra um prompt de shell e cd
para o diretório do seu aplicativo.
Digite isto:
dotnet compile --native
É isso aí! Quando terminar, seu aplicativo será compilado em um único binário, assim:
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 .
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.
A Microsoft anunciou seu .NET Native Preview que permitirá rodar aplicativos .NET sem ter o framework instalado.
Dê uma olhada: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx
FAQ: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx
Você pode baixar o Microsoft .NET Native para VS2013 aqui: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
Sim, usando Ngen , o Native Image Generator. No entanto, há uma série de coisas que você precisa estar ciente:
Resumindo, só vale a pena usar o Ngen se você precisar reduzir o tempo de inicialização do seu aplicativo.
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.
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.
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.
Resposta de 2019: Use dotnet / corert . Ele pode compilar projetos .NET Core em .exe
arquivos 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.
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.
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).
tente isso ( http://www.dotnetnative.online/ ) para compilar exe compilado .net em exe nativo, eu tentei isso, é novo, mas bom.
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