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





Да, используя Ngen, генератор изображений в машинном коде. Однако есть ряд вещей, о которых вам нужно знать:
В общем, Ngen стоит использовать только в том случае, если вам нужно сократить время запуска вашего приложения.
У Microsoft есть статья, описывающая, как можно Скомпилируйте MSIL в собственный код
Вы можете использовать Ngen.
The Native Image Generator (Ngen.exe) is a tool that improves the performance of managed applications. Ngen.exe creates native images, which are files containing compiled processor-specific machine code, and installs them into the native image cache on the local computer. The runtime can use native images from the cache instead using the just-in-time (JIT) compiler to compile the original assembly.
К сожалению, вам по-прежнему нужны библиотеки из фреймворка для запуска вашей программы. В SDK MS .Net framework, о которой я знаю, нет функции, которая позволяла бы скомпилировать все необходимые файлы в один исполняемый файл.
Я не согласен с Эспо. Потому что текст серого цвета говорит о «Runtime», что означает CLR и, следовательно, .NET Framework, которая появляется на картинке, как правильно указал Крис. Однако точка зрения NGen верна. Вопрос в том, что без использования CLR / Runtime / .NET Framework все одинаковы.
Однако пора волноваться, похоже, фреймворк .net наконец-то получил собственный компилятор - msdn.microsoft.com/en-US/vstudio/dotnetnative
ILMerge ваш исполняемый файл .NET и все в его дереве зависимостей, затем Ngen, если вам нужен исполняемый файл независимо от .NET.
RemoteSoft создает инструмент, который компилирует приложение .NET в пакет, который можно запускать без установленного .NET. У меня нет опыта с этим:
Это единственный инструмент, о котором я когда-либо слышал, который может делать это без использования фреймворка. Конечно, стоит 1249 долларов.
Я пытался пару раз за последние несколько лет получить информацию или оценку, но они никогда не возвращали мои электронные письма о ценах или демонстрациях, поэтому я думаю, что их продукт может быть немного подозрительным.
Думаю, это невозможно. Вам также необходимо будет распространить .NET FW. Если вы хотите скомпилировать приложение .NET в собственный код, используйте NGen инструмент
Вы можете использовать ngen.exe для создания нативного образа но, вам все равно придется распространять исходный неродной код, и для него по-прежнему требуется фреймворк, установленный на целевой машине.
Что на самом деле не решает вашу проблему.
Суть .NET заключается в том, чтобы иметь возможность устанавливать приложения, которые были скомпилированы в MSIL, затем либо JIT, либо Ngen, MSIL компилируется в собственный код и сохраняется локально в кеше. Он никогда не предназначался для создания настоящего собственного .exe, который можно запускать независимо от платформы .NET.
Может быть, есть какой-то хак, который делает это, но для меня это кажется небезопасным. Фреймворк требует слишком многих динамических процессов, таких как: динамическая загрузка сборки, генерация кода MSIL и т. д.
Я протестировал несколько из них, и на данный момент единственный, который поддерживает .NET 3.5, а также имеет отличный стек виртуализации, - это КсенокодПостбилд.
При использовании ngen вам по-прежнему необходимо установить платформу .NET, но при использовании инструмента как такового весь ваш управляемый код компилируется в собственный код, поэтому вы можете развернуть его на машинах без наличия инфраструктуры.
Вы можете! Однако вы ограничены .NET 1.1 (для вас нет дженериков): Моно предварительная компиляция (AOT)
Однако это означает, что компиляция действительно является встроенной, поэтому вы больше не сможете развернуть одну сборку байт-кода, вам понадобится одна сборка для каждой платформы.
Первоначально он был разработан, потому что для iPhone нет .NET или Mono, поэтому они и сделали MonoTouch.
Microsoft анонсировала свой Предварительная версия .NET Native, который позволит запускать приложения .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. Посмотрите здесь: 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 подсказки по динамическим сценариям, которые они хотят поддерживать.
+1 - Я годами ждал, чтобы это случилось. Я надеялся, что безумное увлечение «виртуальной машиной» пройдет раньше, но, тем не менее, это происходит. Я ожидаю, что мы скоро увидим возрождение нативной компиляции. Как вы сказали, на данный момент это касается приложений Windows Store, но это лишь вопрос времени, когда рынок настольных компьютеров потребует такого же отношения.
Как уже упоминалось в некоторых других ответах, вы можете использовать инструмент .NET Native для компиляции своего приложения в собственный машинный код. Однако, в отличие от этих ответов, я объясню, как это сделать как.
Шаги:
Установите инструмент dotnet CLI (интерфейс командной строки), который является частью нового набора инструментов .NET Core. Мы будем использовать это для компиляции нашего приложения; вы можете найти хорошую статью об этом здесь.
Откройте приглашение оболочки и cd в каталог вашего приложения.
Введите это:
dotnet compile --native
Вот и все! Когда вы закончите, ваше приложение будет скомпилировано в один двоичный файл, например:

Это будет отдельный исполняемый файл; не включены PDB, сборки или файлы конфигурации (ура!).
В качестве альтернативы, если вам нужна еще более быстрая программа, вы можете запустить это:
dotnet compile --native --cpp
Это оптимизирует вашу программу с помощью генератора кода C++ (в отличие от RyuJIT), поэтому ваше приложение будет еще более оптимизировано для сценариев AOT.
Вы можете найти дополнительную информацию об этом в dotnet CLI Репозиторий GitHub.
Примечание: это поддерживается только для проектов, созданных с помощью .NET Core. (Хотя +1)
Вы забыли очень важную деталь, что .NET Native требует Windows 10.
похоже, не работает с .net core 3.1 какие-либо обновления?
Ответ 2019: Используйте dotnet / corert. Он может компилировать проекты .NET Core в отдельные файлы .exe. Никаких зависимостей (кроме системных библиотек вроде kernel32.dll). Бьюсь об заклад, это именно то, что нужно OP.
Со своей домашней страницы GitHub:
The CoreRT compiler can compile a managed .NET Core application into a native (architecture specific) single-file executable that is easy to deploy. It can also produce standalone dynamic or static libraries that can be consumed by applications written in other programming languages.
Репо сейчас заархивировано и заменено.
Новое репо называется NativeAOT и находится по адресу github.com/dotnet/runtimelab/tree/feature/NativeAOT.
Основная причина для компиляции в Native - защитить ваши коды, в противном случае скомпилированный MSIL похож на развертывание исходных кодов на клиентской машине.
NGEN компилируется в собственный, но также требует развертывания кодов IL, эта цель - просто сократить время запуска, но это также бесполезно.
CoreRt является альфа-версией и работает только с простыми приложениями типа helloworld.
.Net Core компилируется в отдельные исполняемые файлы, но это также не родной exe, это просто заархивированный файл кодов IL, и он будет распаковывать коды во временную папку во время работы.
Мой простой вопрос от Microsoft: если RyuJIT может компилировать IL в нативный на лету, то почему бы вам не скомпилировать тот же IL заблаговременно (AOT).
«CoreRt является альфа-версией и работает только с простыми приложениями типа helloworld». Это неправда - в Steam есть игры (например, street4rage.com), которые более сложные, чем helloworld.
Но CoreRT не может компилировать приложения Winform. Я нашел еще один онлайн-компилятор, который может скомпилировать приложение Winform (dotnetnative.online)
попробуйте это (http://www.dotnetnative.online/), чтобы скомпилировать .net скомпилированный exe в собственный exe, я пробовал это, его новое, но хорошее.
Пожалуйста, опубликуйте содержание ссылки в ответе.
Похоже, на чистом ядре RT работоспособные решения; скоро все приложения перейдут на ядро .net; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xxhttps://docs.microsoft.com/en-us/archive/msdn-magazine/2018/november/net-core-publishing-options-with-net-core
не тестировалось, возможно, со старым win .net sdk возможно сделать аналогичный.
Я не нахожу никаких других причин использовать это, кроме выступлений. Код CLR по-прежнему можно читать, как и раньше, и вам по-прежнему требуется .NET. К сожалению, Microsoft не предоставила инструмента, который исправил бы то, что я считаю большой проблемой (любой может просмотреть ваш высокоуровневый код таким, какой он есть).