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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
91
0
57 254
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

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

В общем, 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, о которой я знаю, нет функции, которая позволяла бы скомпилировать все необходимые файлы в один исполняемый файл.

Я не нахожу никаких других причин использовать это, кроме выступлений. Код CLR по-прежнему можно читать, как и раньше, и вам по-прежнему требуется .NET. К сожалению, Microsoft не предоставила инструмента, который исправил бы то, что я считаю большой проблемой (любой может просмотреть ваш высокоуровневый код таким, какой он есть).

MasterMastic 22.12.2012 00:15

Я не согласен с Эспо. Потому что текст серого цвета говорит о «Runtime», что означает CLR и, следовательно, .NET Framework, которая появляется на картинке, как правильно указал Крис. Однако точка зрения NGen верна. Вопрос в том, что без использования CLR / Runtime / .NET Framework все одинаковы.

Jasmine 11.02.2013 09:29

Однако пора волноваться, похоже, фреймворк .net наконец-то получил собственный компилятор - msdn.microsoft.com/en-US/vstudio/dotnetnative

ferventcoder 04.09.2014 17:02

ILMerge ваш исполняемый файл .NET и все в его дереве зависимостей, затем Ngen, если вам нужен исполняемый файл независимо от .NET.

user11462042 09.04.2020 18:15

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

RemoteSoft Саламандра

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

Slapout 05.01.2009 23:51

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

codenheim 22.05.2014 09:29

Думаю, это невозможно. Вам также необходимо будет распространить .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, но это лишь вопрос времени, когда рынок настольных компьютеров потребует такого же отношения.

codenheim 22.05.2014 09:24

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

Шаги:

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

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

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

    dotnet compile --native
    

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

Native compiled .NET Core EXE

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


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

dotnet compile --native --cpp

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

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

Примечание: это поддерживается только для проектов, созданных с помощью .NET Core. (Хотя +1)

Mahmoud Al-Qudsi 20.01.2017 00:22

Вы забыли очень важную деталь, что .NET Native требует Windows 10.

Elmue 06.11.2018 06:34

похоже, не работает с .net core 3.1 какие-либо обновления?

user1005462 04.10.2020 16:59

Ответ 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.

Репо сейчас заархивировано и заменено.

user541686 09.12.2020 04:03

Новое репо называется NativeAOT и находится по адресу github.com/dotnet/runtimelab/tree/feature/NativeAOT.

S Waye 31.01.2021 15:44

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

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

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

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

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

«CoreRt является альфа-версией и работает только с простыми приложениями типа helloworld». Это неправда - в Steam есть игры (например, street4rage.com), которые более сложные, чем helloworld.

S Waye 14.07.2020 20:16

Но CoreRT не может компилировать приложения Winform. Я нашел еще один онлайн-компилятор, который может скомпилировать приложение Winform (dotnetnative.online)

Rahim Surani 02.09.2020 20:12

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

Пожалуйста, опубликуйте содержание ссылки в ответе.

Russ J 02.09.2020 16:21

Похоже, на чистом ядре 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 возможно сделать аналогичный.

Другие вопросы по теме