Можно ли скомпилировать код.NET IL в машинный код?
Я хотел бы распространять свои программы.NET без.NET Framework. Можно ли скомпилировать программу.NET для машинного кода?
13 ответов
Да, вы можете прекомпилировать с помощью Ngen.exe, однако это не снимает зависимость от CLR.
Вы по-прежнему должны также отправлять сборки IL, единственное преимущество Ngen состоит в том, что ваше приложение может запускаться без вызова JIT, поэтому вы получаете действительно быстрое время запуска.
По данным CLR Via C#:
Кроме того, сборки, предварительно скомпилированные с использованием Ngen, обычно работают медленнее, чем сборки JIT, потому что JIT-компилятор может оптимизировать работу на целевой машине (32-разрядные, 64-разрядные, специальные регистры и т. Д.), Тогда как NGEN просто производит базовую компиляцию.
РЕДАКТИРОВАТЬ:
Существует некоторая дискуссия по поводу вышеупомянутой информации от CLR Via C#, поскольку некоторые говорят, что вы должны запускать Ngen на целевой машине только в процессе установки.
Remotesoft имеет один: Salamander.NET Linker
У меня нет никакого опыта с этим все же.
Есть некоторые сторонние инструменты, которые делают это, например,
Другой (дорогой и проприетарный, лицензии начинаются от 1599 долларов) продукт, который может сделать это, - Xenocode Postbuild. Я сам этим не пользовался, хотя он стоил около валового национального продукта маленькой африканской страны и всего...
Да, вы можете сейчас! Недавно Microsoft анонсировала .NET Native, часть технологии, которая компилирует ваше приложение со средой выполнения.NET Native (они называют это MRT) в один двоичный файл (фактически один исполняемый файл и одну динамическую библиотеку).
Смотрите ссылки: http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx http://blogs.msdn.com/b/dotnet/archive/2014/04/24/dotnetnative-performance.aspx
Можно ли скомпилировать код.NET IL в машинный код?
Да, но.NET Framework делает это за вас во время выполнения (по умолчанию) или во время установки (ngen). Среди прочих причин этот IL -> машинный код выполняется отдельно на каждой машине установки, поэтому его можно оптимизировать для этой конкретной машины.
Я хотел бы распространять свои программы.NET без.NET Framework. Можно ли скомпилировать программу.NET для машинного кода?
Нет, для всех намерений и целей вы не можете сделать это. Сторонние обходные пути могут работать в некоторых сценариях, но к тому времени я бы больше не считал это "управляемым кодом" или ".NET".
Я не думаю, что это возможно. Вы можете сделать предустановленную сборку, но вам все еще нужна структура.
Я думаю, что вы не должны: это задача JIT-компилятора.
Однако вы можете использовать ClickOnce или установщик Windows для его развертывания, чтобы отсутствующая платформа не была такой большой проблемой: вы могли бы сказать установщику, что нужно загрузить и установить эту платформу.
Если вы просто обеспокоены размером развертывания Framework, вы можете прочитать об этом.
Посмотрите на проект MONO: команда mono с опцией --aot. http://www.mono-project.com/AOT
Для тех, кто использует .NET Core или более позднюю версию .NET (5+), существует вариант автономного развертывания, который описан в MSDN как
Выходная папка публикации содержит все компоненты приложения, включая библиотеки .NET и целевую среду выполнения. Приложение изолировано от других приложений .NET и не использует локально установленную общую среду выполнения. Пользователю вашего приложения не обязательно загружать и устанавливать .NET.
Шаги по подготовке автономного развертывания:
- Переключите конфигурацию решения с «Отладки» на «Выпуск».
- Щелкните проект правой кнопкой мыши в обозревателе решений и выберите «Опубликовать».
- Выберите папку в качестве цели и нажмите «Далее».
- Снова выберите папку в качестве конкретной цели и нажмите «Далее».
- На вкладке «Местоположение» найдите путь к целевым двоичным файлам и нажмите «Готово».
- На вкладке «Публикация» щелкните маленький значок карандаша («Изменить целевую среду выполнения») в конце строки «Целевая среда выполнения».
- В диалоговом окне «Настройки профиля» (показано ниже) выберите «Автономный» в раскрывающемся списке «Режим развертывания».
- Выберите свою среду выполнения в раскрывающемся списке Целевая среда выполнения.
- (Необязательно) Укажите путь вывода двоичных файлов в поле со списком Целевое расположение.
- Нажмите «Сохранить».
- Когда вы нажмете кнопку «Опубликовать» на вкладке «Опубликовать», ваши двоичные файлы будут созданы.
Существуют и другие варианты развертывания, такие как Azure, реестр контейнеров Docker и т. д., но для простоты я выбрал вариант «Папка». Обратите внимание, что шаги и снимок экрана относятся к VS 2019.
Дополнительную информацию см. в разделе «Автономная публикация» .
Я всегда думал, что было бы здорово скомпилировать C# в машинный код напрямую без зависимости от CLR....