Как скомпилировать .NET-приложение в машинный код?

90

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

Нияз
источник

Ответы:

45

В Microsoft есть статья, в которой описывается, как скомпилировать MSIL в собственный код.

Вы можете использовать Ngen .

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

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

Espo
источник
1
Я не нахожу никакой другой причины использовать это, кроме выступлений. Код CLR все еще можно читать, как и раньше, и вам по-прежнему требуется .NET. К сожалению, Microsoft не предоставила инструмента, который бы исправил то, что я считаю большой проблемой (любой может просмотреть ваш высокоуровневый код как есть)
MasterMastic
Я не согласен с Эспо. Потому что текст серым цветом говорит о «Runtime», что означает CLR и, следовательно, .NET Framework, которая появляется на картинке, как правильно указал Крис. Однако точка зрения NGen верна. Вопрос в том, что без использования CLR / Runtime / .NET Framework все одинаковы.
Жасмин
1
Однако пора волноваться, похоже, фреймворк .net наконец-то получил собственный компилятор - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder
ILMerge ваш исполняемый файл .NET и все в его дереве зависимостей, затем Ngen, если вам нужен исполняемый файл, независимый от .NET .
24

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

RemoteSoft Саламандра

Саймон Стил
источник
5
Это единственный инструмент, о котором я когда-либо слышал, который сделает это без использования фреймворка. Конечно, стоит 1249 долларов.
Slapout 05
3
Я пытался пару раз за последние несколько лет получить информацию или оценку, но они никогда не возвращали мои электронные письма о ценах или демонстрациях, поэтому я думаю, что их продукт может быть немного подозрительным.
Коденхайм
21

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

Шаги:

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

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

  3. Введите это:

    dotnet compile --native
    

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

Собственный скомпилированный .NET Core EXE

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


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

dotnet compile --native --cpp

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

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

Джеймс Ко
источник
Примечание: это поддерживается только для проектов, созданных с помощью .NET Core. (+1, хотя)
Махмуд Аль-Кудси
Вы забыли очень важную деталь, что для .NET Native требуется Windows 10.
Элмью
похоже, не работает с .net core 3.1 какие-либо обновления?
user1005462
19

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

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

Эрик Сгарби
источник
19

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

Взгляните: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx

Часто задаваемые вопросы: http://msdn.microsoft.com/en-US/vstudio/dn642499.aspx

Вы можете загрузить Microsoft .NET Native для VS2013 отсюда: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

thepirat000
источник
11

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

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

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

Крис Цвирик
источник
9

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

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

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

Камило Мартин
источник
6

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

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

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

m_eric
источник
1
+1 - Я годами ждал, чтобы это случилось. Я надеялся, что увлечение мира «виртуальной машиной» пройдет раньше, но, тем не менее, это происходит. Я ожидаю, что мы скоро увидим возрождение нативной компиляции. Как вы сказали, на данный момент это касается приложений Windows Store, но это лишь вопрос времени, когда рынок настольных компьютеров потребует такого же отношения.
Коденхейм
4

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

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

Мэтт Бишоп
источник
2

Ответ 2019: используйте dotnet / corert . Он может компилировать проекты .NET Core в отдельные .exeфайлы. Никаких зависимостей (кроме системных библиотек вроде kernel32.dll). Бьюсь об заклад, это именно то, что нужно OP.

На его домашней странице GitHub:

Компилятор CoreRT может скомпилировать управляемое приложение .NET Core в собственный (зависящий от архитектуры) однофайловый исполняемый файл, который легко развернуть. Он также может создавать автономные динамические или статические библиотеки, которые могут использоваться приложениями, написанными на других языках программирования.

BRK
источник
1

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

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

Spoulson
источник
0

Основная причина для компиляции в Native - защитить ваши коды, в противном случае скомпилированный MSIL похож на развертывание исходных кодов на клиентском компьютере.

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

CoreRt является альфа-версией и работает только с простыми приложениями типа helloworld.

.Net Core компилируется в отдельные исполняемые файлы, но это также не родной exe, это просто заархивированный файл кодов IL, и он будет распаковывать коды во временную папку во время работы.

Мой простой вопрос от Microsoft: если RyuJIT может компилировать IL в нативный на лету, то почему бы вам не скомпилировать тот же IL заблаговременно (AOT).

Рахим Сурани
источник
«CoreRt является альфа-версией и работает только с простыми приложениями типа helloworld». Это неправда - в Steam есть игры (например, street4rage.com ), которые сложнее helloworld.
S Waye,
Но CoreRT не может компилировать приложения Winform. Я нашел еще один онлайн-компилятор, который может скомпилировать приложение Winform ( dotnetnative.online )
Рахим Сурани
0

Похоже, чистые RT работоспособные решения; скоро все приложения перейдут на ядро ​​.net; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us / Архив / msdn-magazine / 2018 / ноябрь / net-core-publishing-options-with-net-core

не тестировалось, возможно, со старым win .net sdk возможно сделать то же самое.

user1005462
источник
-1

попробуйте это ( http://www.dotnetnative.online/ ), чтобы скомпилировать .net скомпилированный exe в собственный exe, я пробовал это, он новый, но хороший.

Рахим Сурани
источник
Пожалуйста, опубликуйте содержание ссылки в ответе.
Russ J,
-3

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

аку
источник