Как скомпилировать a.NET применение к машинному коду?


Если я хочу запустить приложение .NET на машине, где платформа .NET framework недоступна; есть ли способ скомпилировать приложение в машинный код?

11 85

11 ответов:

У Microsoft есть статья, описывающая, как вы можете скомпилировать MSIL в машинный код

можно использовать Ngen.

Генератор Собственных Изображений (Ngen.исполняемый) это инструмент, который улучшает производительность управляемых приложений. Ngen платформы.exe создает собственные образы, которые скомпилированные файлы, содержащие машинный код, специфичный для процессора, и устанавливает их в собственный образ кэш на локальном компьютере. Этот среда выполнения может использовать собственный изображения из вместо кэша, используя точно в срок (JIT) компилятор для компиляции исходной собрание.

к сожалению, вам все еще нужны библиотеки из фреймворка для запуска вашей программы. Там нет функции, которую я знаю С MS .Net framework SDK, что позволяет скомпилировать все необходимые файлы в один исполняемый файл

RemoteSoft делает инструмент, который компилирует приложение .NET в пакет, который может быть запущен без установленной .NET. У меня нет никакого опыта в этом:

RemoteSoft Salamander

я протестировал несколько из них, и на данный момент единственный, который поддерживает .NET 3.5, а также имеет отличный стек виртуализации, - это XenocodePostbuild

с помощью ngen вам все еще нужно установить .NET framework, но с помощью инструмента как такового весь ваш управляемый код компилируется в машинный код, чтобы вы могли развернуть его на машинах без присутствия платформы.

Microsoft объявила о своем.NET Native Preview это позволит запускать приложения .NET без установки фреймворка.

взгляните: 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

вы можете скачать Microsoft .NET Native для VS2013 здесь: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

как уже упоминалось в некоторых других ответах, вы можете использовать .NET Native инструмент для компиляции вашего приложения в машинный код. В отличие от этих ответов, однако, я объясню как сделать это.

действия:

  1. установить dotnet CLI инструмент (интерфейс командной строки), которая является частью новой .Чистый основной набор инструментов. Мы будем использовать это, чтобы скомпилировать наше приложение, вы можете найти хорошую статью об этом здесь.

  2. откройте окно командной строки и cd в каталог вашего приложения.

  3. тип:
    dotnet compile --native
    

вот именно! Когда вы закончите, ваше приложение будет скомпилировано до одного двоичного файла, например:

Native compiled .NET Core EXE

это будет автономный исполняемый файл; нет PDBs, сборки или конфигурационные файлы включены (ура!).


кроме того, если вы хотите еще быстрее программа, вы можете запустить это:

dotnet compile --native --cpp

Это позволит оптимизировать вашу программу с помощью генератора кода C++ (в отличие от RyuJIT), поэтому ваше приложение еще более оптимизировано для сценариев AOT.

вы можете найти дополнительную информацию об этом в dotnet CLI GitHub repo.

да, с помощью Ngen генератор образов в машинном коде. Однако есть ряд вещей, которые вы должны знать:

  • вам все еще нужна среда CLR для запуска исполняемого файла.
  • среда CLR не будет динамически оптимизировать сборки на основе среды, в которой она выполняется (например, 486 против 586 против 686 и т. д.)

в целом, стоит использовать Ngen только в том случае, если вам нужно уменьшить время запуска вашего приложения.

вы можете! Однако вы ограничены .NET 1.1 (нет дженериков для вас): Mono Ahead-Of-Time compilation (AOT)

однако это означает, что компиляция действительно является родной, поэтому вы больше не сможете развертывать одну сборку байт-кода, вам понадобится один на платформу.

Он был первоначально разработан, потому что нет .NET или Mono для iPhone, так что они сделали MonoTouch.

вы можете сделать это с помощью новой технологии предварительной компиляции под названием .NET Native. Проверьте это здесь: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

В настоящее время он доступен только для приложений Магазина Windows. Он выполняет связывание одного компонента. Таким образом, библиотеки .NET Framework статически связаны с вашим приложением. Все компилируется в native и сборки IL больше не развертываются. Приложения не работают против среды CLR, но урезанная, оптимизированная среда выполнения называется Управляемая Среда Выполнения (Mrt.dll)

Как указано выше, NGEN использовал модель компиляции mix и полагался на IL и JIT для динамических сценариев. .Чистый родной не использует JIT-компилятором, но он поддерживает различные динамические сценарии. Авторы кода должны будут использовать Директивы Времени Выполнения для предоставления подсказок компилятору .NET Native о динамических сценариях, которые они хотят поддерживать.

вы можете использовать ngen платформы.exe для создания собственного образа но вам все еще нужно распространять исходный неродной код, а также, и он по-прежнему нуждается в структуре, установленной на целевой машине.

что на самом деле не решает вашу проблему.

природа .NET заключается в том, чтобы иметь возможность устанавливать приложения, которые были скомпилированы в MSIL, а затем либо JIT, либо Ngen, MSIL компилируется в машинный код и хранится локально в кэше. Он никогда не был предназначен для создания истинного туземца .exe, который может быть запущен независимо от платформы .NET framework.

может есть какой хак, который делает это, но это не безопасно для меня. Существует слишком много динамик, которые требуют платформы, такие как: динамическая загрузка сборки, генерация кода MSIL, так далее.

Я думаю, что это не возможно. Вам нужно будет распространять .Чистая прошивки, а также. Если вы хотите скомпилировать приложение .NET в машинный код, используйте NGen инструмент