Можно ли скомпилировать код .NET IL в машинный код?
-
02-07-2019 - |
Вопрос
Я хотел бы распространять свои программы .NET без платформы .NET.Можно ли скомпилировать программу .NET в машинный код?
Решение
Да, вы можете выполнить предварительную компиляцию с помощью Ngen.exe, однако это не устранит зависимость от CLR.
Вам все равно придется отправлять сборки IL. Единственное преимущество Ngen заключается в том, что ваше приложение может запускаться без вызова JIT, поэтому вы получаете очень быстрый запуск.
Согласно CLR через С#:
Кроме того, сборки, предварительные с использованием NGEN, обычно медленнее, чем сборы JIT'Ed, потому что компилятор JIT может оптимизировать на машину Target (32-битный?64-битный?Специальные регистры?и т. Д.), В то время как NGEN просто будет производить базовую компиляцию.
РЕДАКТИРОВАТЬ:
По поводу приведенной выше информации из CLR через C# ведутся некоторые споры, поскольку некоторые говорят, что вам необходимо запускать Ngen на целевой машине только как часть процесса установки.
Другие советы
У Remotesoft есть один:Саламандра .NET-линкер
Хотя у меня нет никакого опыта в этом.
Есть некоторые сторонние инструменты, которые делают это, например.
Другой (дорогой и проприетарный продукт, стоимость лицензии начинается от 1599 долларов США), который может это сделать, — Постбилд ксенокода.Хотя сам я им не пользовался, поскольку его стоимость равна валовому национальному продукту небольшой африканской страны и все такое...
Можно ли компилировать код .NET IL с машинным кодом?
Да, но .NET Framework делает это за вас во время выполнения (по умолчанию) или во время установки (ngen).Помимо прочего, этот машинный код IL -> выполняется отдельно на каждой установочной машине, поэтому его можно оптимизировать для этой конкретной машины.
Я хотел бы распространять свои программы .NET без .NET Framework.Можно ли составить программу .NET для машинного кода?
Нет, по сути, вы не можете этого сделать.Сторонние обходные пути могут работать в некоторых сценариях, но к тому времени я бы уже не считал это «управляемым кодом» или «.NET».
Да, теперь вы можете!Недавно Microsoft объявила .NET родной, часть технологии, которая компилирует ваше приложение с помощью среды выполнения .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
Есть IL2CPU для части компиляции.
Я не думаю, что это возможно.Вы можете создать заранее подготовленную сборку, но вам все равно понадобится фреймворк.
Если вас интересует только размер развертывания Framework, вы можете прочитать этот.
Я думаю, вам не следует:Это задача JIT-компилятора.
Однако вы можете использовать ClickOnce или установщик Windows для его развертывания, чтобы отсутствующая платформа не была такой большой проблемой:вы можете указать установщику загрузить Framework и установить его.
Посмотрите проект MONO:моно-команда с опцией --aot. http://www.mono-project.com/AOT
Я всегда думал, что было бы здорово скомпилировать C# в машинный код напрямую, без зависимости от CLR....