Якщо я хочу запустити програму .NET на машині, де платформа .NET недоступна; Чи є спосіб скомпілювати додаток до власного коду?
Відповіді:
Корпорація Майкрософт має статтю, в якій описується, як можна скомпілювати MSIL до власного коду
Ви можете використовувати Нген .
Генератор власних зображень (Ngen.exe) - це інструмент, який покращує продуктивність керованих програм. Ngen.exe створює власні зображення, які представляють собою файли, що містять скомпільований специфічний машинний код процесора, та встановлює їх у кеш власного зображення на локальному комп'ютері. Виконавець може використовувати власні зображення з кешу, замість цього використовуючи компілятор "Jit" для компіляції вихідної збірки.
На жаль, для запуску вашої програми вам все ще потрібні бібліотеки з фреймворку. Я не знаю жодної функції, яку я знаю, з SDK Framework MS .Net, яка дозволяє компілювати всі необхідні файли в один виконуваний файл
RemoteSoft робить інструмент для компіляції програми .NET у пакет, який можна запустити без встановлення .NET. У мене немає досвіду з цим:
Як згадувались деякі інші відповіді тут, ви можете скористатись інструментом .NET Native , щоб скомпілювати додаток до власного машинного коду. Однак, на відміну від цих відповідей, я поясню, як це зробити.
Кроки:
Встановіть інструмент dotnet CLI (інтерфейс командного рядка), який є частиною нового ланцюжка інструментів .NET Core. Ми використаємо це для компіляції нашого додатку; Ви можете знайти хорошу статтю про це тут.
Відкрийте підказку оболонки та cd
перейдіть до каталогу вашої програми.
Введіть це:
dotnet compile --native
Це воно! Коли ви закінчите, ваш додаток буде скомпільований до єдиного двійкового файлу, наприклад:
Це буде самостійний виконуваний файл; жоден PDB, збірки та конфігураційні файли не входять (ура!).
Крім того, якщо ви хочете ще швидшу програму, ви можете запустити таку:
dotnet compile --native --cpp
Це дозволить оптимізувати вашу програму за допомогою генератора коду C ++ (на відміну від RyuJIT), тому ваш додаток ще більше оптимізований для сценаріїв AOT.
Ви можете знайти більше інформації про це в репозиторії 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
FAQ: 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 (AOT)
Однак це означає, що компіляція є справді рідною, тому ви більше не зможете розгортати одну збірку байт-кодів, вам знадобиться по одній на платформу.
Спочатку він був розроблений, оскільки для iPhone не існує .NET або Mono, тож саме так вони зробили MonoTouch.
Ви можете зробити це за допомогою нової технології попередньої компіляції під назвою .NET Native. Перевірте це тут: http://msdn.microsoft.com/en-US/vstudio/dotnetnative
На даний момент він доступний лише для програм Магазину Windows. Він виконує однокомпонентне зв’язування. Отже, бібліотеки .NET Framework статично пов’язані з вашим додатком. Все компілюється до власних і збірки IL більше не розгортаються. Програми працюють не проти CLR, а позбавленого оптимізованого середовища виконання під назвою керований час виконання (Mrt.dll)
Як зазначено вище, NGEN використовував компіляційну модель комбінації і спирався на IL та JIT для динамічних сценаріїв. .NET Native не використовує JIT, але підтримує різні динамічні сценарії. Авторам коду потрібно буде використовувати директиви виконання, щоб надати нативному компілятору .NET вказівки щодо динамічних сценаріїв, які вони хочуть підтримати.
Ви можете використовувати ngen.exe для створення власного зображення, але вам все одно доведеться розповсюджувати також оригінальний код, і йому все ще потрібна структура, встановлена на цільовій машині.
Що насправді не вирішує вашу проблему.
Відповідь 2019: Використовуйте dotnet / corert . Він може компілювати проекти .NET Core у самостійні .exe
файли. Ніяких залежностей (за винятком системних бібліотек типу kernel32.dll
). Б'юся об заклад, це саме те, що потрібно ОП.
З домашньої сторінки GitHub:
Компілятор CoreRT може скомпілювати керовану програму .NET Core у власний (архітектурно специфічний) виконуваний файл, який легко розгорнути. Він також може створювати окремі динамічні або статичні бібліотеки, які можуть використовувати програми, написані іншими мовами програмування.
Природа .NET полягає в можливості встановлювати програми, які були скомпільовані в MSIL, а потім, за допомогою JIT або Ngen, MSIL компілюється у власний код і зберігається локально в кеші. Він ніколи не призначався для створення справжнього власного .exe, який можна запускати незалежно від середовища .NET.
Можливо, є якийсь хакер, який це робить, але це не здається мені безпечним. Занадто багато динаміки, яка вимагає фреймворку, наприклад: динамічне завантаження збірки, генерація коду MSIL тощо.
Основною причиною компіляції в Native є захист ваших кодів, інакше скомпільований MSIL схожий на розгортання вихідних кодів на машині клієнта.
NGEN компілюється в рідну форму, але також потребує розгортання кодів IL, ця мета - просто зменшити час запуску, але вона також марна.
CoreRt - це альфа-версія і працює лише з простими додатками типу helloworld.
.Net Core компілюється в окремі виконувані файли, але він також не є рідною програмою exe, це просто стиснутий файл із кодами IL, і він буде розпаковувати коди в папку temp під час запуску.
Моє просте запитання від Microsoft полягає в тому, що якщо RyuJIT може на ходу компілювати IL в рідний, то чому б і вам не скомпілювати той самий IL заздалегідь (AOT).
Схоже на робочі рішення мережі RT core; незабаром усі додатки перейдуть на .net core; https://www.codeproject.com/Articles/5262251/Generate-Native-Executable-from-NET-Core-3-1-Proje?msg=5753507#xx5753507xx https://docs.microsoft.com/en-us / archive / msdn-magazine / 2018 / листопад / net-core-publishing-options-with-net-core
не перевірено, можливо, зі старим win .net sdk можливо зробити подібне.
спробуйте це ( http://www.dotnetnative.online/ ) для компіляції .net compiled exe у рідний exe, я спробував це, нове, але добре.
Я думаю, що це неможливо. Вам також потрібно буде поширити .NET FW. Якщо ви хочете скомпілювати програму .NET для власного коду, використовуйте інструмент NGen