Если я хочу запустить .NET-приложение на машине, на которой .NET framework недоступен; Есть ли способ скомпилировать приложение в машинный код?
Ответы:
В Microsoft есть статья, в которой описывается, как скомпилировать MSIL в собственный код.
Вы можете использовать Ngen .
Генератор собственных образов (Ngen.exe) - это инструмент, повышающий производительность управляемых приложений. Ngen.exe создает образы в машинном коде, которые представляют собой файлы, содержащие скомпилированный машинный код для конкретного процессора, и устанавливает их в кэш собственных образов на локальном компьютере. Среда выполнения может использовать собственные образы из кэша вместо JIT-компилятора для компиляции исходной сборки.
К сожалению, вам по-прежнему нужны библиотеки из фреймворка для запуска вашей программы. В SDK MS .Net framework, о которой я знаю, нет функции, которая позволяла бы скомпилировать все необходимые файлы в один исполняемый файл.
RemoteSoft создает инструмент, который компилирует приложение .NET в пакет, который можно запускать без установленного .NET. У меня нет опыта с этим:
Как уже упоминалось в некоторых других ответах, вы можете использовать инструмент .NET Native для компиляции своего приложения в собственный машинный код. Однако, в отличие от этих ответов, я объясню, как это сделать.
Шаги:
Установите инструмент dotnet CLI (интерфейс командной строки), который является частью нового набора инструментов .NET Core. Мы будем использовать это для компиляции нашего приложения; Вы можете найти хорошую статью об этом здесь.
Откройте приглашение оболочки и перейдите cd
в каталог вашего приложения.
Введите это:
dotnet compile --native
Это оно! Когда вы закончите, ваше приложение будет скомпилировано в один двоичный файл, например:
Это будет отдельный исполняемый файл; не включены PDB, сборки или файлы конфигурации (ура!).
В качестве альтернативы, если вам нужна еще более быстрая программа, вы можете запустить это:
dotnet compile --native --cpp
Это позволит оптимизировать вашу программу с использованием генератора кода C ++ (в отличие от RyuJIT), поэтому ваше приложение будет еще более оптимизировано для сценариев AOT.
Дополнительную информацию об этом можно найти в репозитории dotnet CLI GitHub .
Я протестировал несколько из них, и на данный момент единственный, который поддерживает .NET 3.5, а также имеет отличный стек виртуализации, - это Xenocode Postbuild.
При использовании ngen вам по-прежнему необходимо установить платформу .NET, но при использовании инструмента как такового весь ваш управляемый код компилируется в собственный код, поэтому вы можете развернуть его на машинах без присутствия платформы.
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
Да, используя Ngen , генератор изображений в машинном коде . Однако есть ряд вещей, о которых вам нужно знать:
В общем, Ngen стоит использовать только в том случае, если вам нужно сократить время запуска вашего приложения.
Вы можете! Однако вы ограничены .NET 1.1 (для вас нет универсальных шаблонов): Mono Ahead-Of-Time compilation (AOT)
Однако это означает, что компиляция действительно является встроенной, поэтому вы больше не сможете развернуть одну сборку байт-кода, вам понадобится одна сборка для каждой платформы.
Первоначально он был разработан, потому что для iPhone нет .NET или Mono, поэтому они и сделали MonoTouch.
Это можно сделать с помощью новой технологии предварительной компиляции .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 подсказки по динамическим сценариям, которые они хотят поддерживать.
Вы можете использовать ngen.exe для создания образа в машинном коде, но вам по-прежнему необходимо распространять исходный код, не являющийся машинным, и для этого по-прежнему требуется фреймворк, установленный на целевой машине.
Что на самом деле не решает вашу проблему.
Ответ 2019: используйте dotnet / corert . Он может компилировать проекты .NET Core в отдельные .exe
файлы. Никаких зависимостей (кроме системных библиотек вроде kernel32.dll
). Бьюсь об заклад, это именно то, что нужно OP.
На его домашней странице GitHub:
Компилятор CoreRT может скомпилировать управляемое приложение .NET Core в собственный (зависящий от архитектуры) однофайловый исполняемый файл, который легко развернуть. Он также может создавать автономные динамические или статические библиотеки, которые могут использоваться приложениями, написанными на других языках программирования.
Суть .NET заключается в том, чтобы иметь возможность устанавливать приложения, которые были скомпилированы в MSIL, а затем либо JIT, либо Ngen, MSIL компилируется в собственный код и сохраняется локально в кеше. Он никогда не предназначался для создания настоящего собственного .exe, который можно запускать независимо от платформы .NET.
Может быть, есть какой-нибудь хак, который делает это, но для меня это кажется небезопасным. Фреймворк требует слишком много динамики, например: динамическая загрузка сборки, генерация кода MSIL и т. Д.
Основная причина для компиляции в Native - защитить ваши коды, в противном случае скомпилированный MSIL похож на развертывание исходных кодов на клиентском компьютере.
NGEN компилируется в собственный, но также требует развертывания кодов IL, эта цель - просто уменьшить время запуска, но это также бесполезно.
CoreRt является альфа-версией и работает только с простыми приложениями типа helloworld.
.Net Core компилируется в отдельные исполняемые файлы, но это также не родной exe, это просто заархивированный файл кодов IL, и он будет распаковывать коды во временную папку во время работы.
Мой простой вопрос от Microsoft: если RyuJIT может компилировать IL в нативный на лету, то почему бы вам не скомпилировать тот же IL заблаговременно (AOT).
Похоже, чистые 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 возможно сделать то же самое.
попробуйте это ( http://www.dotnetnative.online/ ), чтобы скомпилировать .net скомпилированный exe в собственный exe, я пробовал это, он новый, но хороший.
Я думаю, это невозможно. Вам также необходимо будет распространить .NET FW. Если вы хотите скомпилировать приложение .NET в собственный код, используйте инструмент NGen