Як скомпілювати програму .NET для власного коду?


89

Якщо я хочу запустити програму .NET на машині, де платформа .NET недоступна; Чи є спосіб скомпілювати додаток до власного коду?

Відповіді:


45

Корпорація Майкрософт має статтю, в якій описується, як можна скомпілювати MSIL до власного коду

Ви можете використовувати Нген .

Генератор власних зображень (Ngen.exe) - це інструмент, який покращує продуктивність керованих програм. Ngen.exe створює власні зображення, які представляють собою файли, що містять скомпільований специфічний машинний код процесора, та встановлює їх у кеш власного зображення на локальному комп'ютері. Виконавець може використовувати власні зображення з кешу, замість цього використовуючи компілятор "Jit" для компіляції вихідної збірки.

На жаль, для запуску вашої програми вам все ще потрібні бібліотеки з фреймворку. Я не знаю жодної функції, яку я знаю, з SDK Framework MS .Net, яка дозволяє компілювати всі необхідні файли в один виконуваний файл


1
Я не знаходжу жодної іншої причини використовувати це, крім вистав. Код CLR все ще можна прочитати, як і раніше, і ви все ще потребуєте .NET. Отже, розчаровуючи, Microsoft не надала інструменту, який би вирішив, як я вважаю, велику проблему (кожен може переглядати ваш код високого рівня таким, яким він є)
MasterMastic

Я не згоден з Еспо. Тому що в тексті сірим кольором написано "Runtime", що означає CLR і, отже, .NET Framework, що з'являється на малюнку, як справедливо вказав Кріс. Однак точка NGen відповідає дійсності. Питання в тому, що без використання CLR / Runtime / .NET Framework всі однакові.
Жасмин

1
Настав час хвилюватися, схоже, що .net framework нарешті отримує власний компілятор - msdn.microsoft.com/en-US/vstudio/dotnetnative
ferventcoder

ILMerge .NET-файл, що виконується, і все, що є в його дереві залежностей, а потім Ngen, якщо ви хочете виконуваний файл, незалежний від .NET .

24

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

RemoteSoft Salamander


5
Це єдиний інструмент, про який я коли-небудь чув, який буде робити це, не потребуючи фреймворку. Звичайно, це коштує 1249 доларів.
Slapout

3
Протягом останніх кількох років я пару разів намагався отримати інформацію чи оцінку, але вони ніколи не повертають мої електронні листи про ціни та демонстраційні демонстрації, тому я думаю, що їх продукт може бути трохи підозрілим.
codenheim

21

Як згадувались деякі інші відповіді тут, ви можете скористатись інструментом .NET Native , щоб скомпілювати додаток до власного машинного коду. Однак, на відміну від цих відповідей, я поясню, як це зробити.

Кроки:

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

  2. Відкрийте підказку оболонки та cdперейдіть до каталогу вашої програми.

  3. Введіть це:

    dotnet compile --native
    

Це воно! Коли ви закінчите, ваш додаток буде скомпільований до єдиного двійкового файлу, наприклад:

Власна компільована .NET Core EXE

Це буде самостійний виконуваний файл; жоден PDB, збірки та конфігураційні файли не входять (ура!).


Крім того, якщо ви хочете ще швидшу програму, ви можете запустити таку:

dotnet compile --native --cpp

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

Ви можете знайти більше інформації про це в репозиторії CLI GitHub .


Примітка: це підтримується лише для проектів, побудованих за допомогою .NET Core. (+1, правда)
Махмуд Аль-Кудсі

Ви забули дуже важливу деталь, згідно з якою .NET Native вимагає Windows 10.
Елму,

схоже, не працює з .net core 3.1 будь-які оновлення?
user1005462

19

Я протестував кілька з них, і на даний момент єдиним, що підтримує .NET 3.5, а також має чудовий стек віртуалізації, є Xenocode Postbuild

З ngen вам все ще потрібно встановити платформу .NET, але за допомогою інструменту весь ваш керований код компілюється у власний код, щоб ви могли розгорнути його на машинах без присутності фреймворку.


19

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


11

Так, використовуючи Ngen , власний генератор зображень. Однак є декілька речей, про які потрібно знати:

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

Загалом, використовувати Ngen варто лише в тому випадку, якщо вам потрібно скоротити час запуску програми.


9

Ти можеш! Однак ви обмежені .NET 1.1 (для вас немає загальних засобів): компіляція Mono Ahead-Of-Time (AOT)

Однак це означає, що компіляція є справді рідною, тому ви більше не зможете розгортати одну збірку байт-кодів, вам знадобиться по одній на платформу.

Спочатку він був розроблений, оскільки для iPhone не існує .NET або Mono, тож саме так вони зробили MonoTouch.


6

Ви можете зробити це за допомогою нової технології попередньої компіляції під назвою .NET Native. Перевірте це тут: http://msdn.microsoft.com/en-US/vstudio/dotnetnative

На даний момент він доступний лише для програм Магазину Windows. Він виконує однокомпонентне зв’язування. Отже, бібліотеки .NET Framework статично пов’язані з вашим додатком. Все компілюється до власних і збірки IL більше не розгортаються. Програми працюють не проти CLR, а позбавленого оптимізованого середовища виконання під назвою керований час виконання (Mrt.dll)

Як зазначено вище, NGEN використовував компіляційну модель комбінації і спирався на IL та JIT для динамічних сценаріїв. .NET Native не використовує JIT, але підтримує різні динамічні сценарії. Авторам коду потрібно буде використовувати директиви виконання, щоб надати нативному компілятору .NET вказівки щодо динамічних сценаріїв, які вони хочуть підтримати.


1
+1 - Я чекав років, щоб це сталося. Я сподівався, що закоханість у світ "Віртуальною машиною" запуститься це швидше раніше, але тим не менше, це відбувається. Я сподіваюся, ми скоро побачимо пожвавлення рідної компіляції. Як ви вже сказали, на даний момент це для додатків Window's Store, але це лише питання часу, коли ринок настільних ПК вимагатиме рівного ставлення.
codenheim

4

Ви можете використовувати ngen.exe для створення власного зображення, але вам все одно доведеться розповсюджувати також оригінальний код, і йому все ще потрібна структура, встановлена ​​на цільовій машині.

Що насправді не вирішує вашу проблему.


2

Відповідь 2019: Використовуйте dotnet / corert . Він може компілювати проекти .NET Core у самостійні .exeфайли. Ніяких залежностей (за винятком системних бібліотек типу kernel32.dll). Б'юся об заклад, це саме те, що потрібно ОП.

З домашньої сторінки GitHub:

Компілятор CoreRT може скомпілювати керовану програму .NET Core у власний (архітектурно специфічний) виконуваний файл, який легко розгорнути. Він також може створювати окремі динамічні або статичні бібліотеки, які можуть використовувати програми, написані іншими мовами програмування.


1

Природа .NET полягає в можливості встановлювати програми, які були скомпільовані в MSIL, а потім, за допомогою JIT або Ngen, MSIL компілюється у власний код і зберігається локально в кеші. Він ніколи не призначався для створення справжнього власного .exe, який можна запускати незалежно від середовища .NET.

Можливо, є якийсь хакер, який це робить, але це не здається мені безпечним. Занадто багато динаміки, яка вимагає фреймворку, наприклад: динамічне завантаження збірки, генерація коду MSIL тощо.


0

Основною причиною компіляції в Native є захист ваших кодів, інакше скомпільований MSIL схожий на розгортання вихідних кодів на машині клієнта.

NGEN компілюється в рідну форму, але також потребує розгортання кодів IL, ця мета - просто зменшити час запуску, але вона також марна.

CoreRt - це альфа-версія і працює лише з простими додатками типу helloworld.

.Net Core компілюється в окремі виконувані файли, але він також не є рідною програмою exe, це просто стиснутий файл із кодами IL, і він буде розпаковувати коди в папку temp під час запуску.

Моє просте запитання від Microsoft полягає в тому, що якщо RyuJIT може на ходу компілювати IL в рідний, то чому б і вам не скомпілювати той самий IL заздалегідь (AOT).


"CoreRt - це альфа-версія і працює лише з простими додатками типу helloworld." Це неправда - у Steam є ігри (наприклад, street4rage.com ), які є більш складними, ніж helloworld.
S Waye

Але CoreRT не може компілювати будь-які програми Winform. Я знайшов іншого онлайн-компілятора, який може скомпілювати додаток Winform ( dotnetnative.online )
Рахім Сурані

0

Схоже на робочі рішення мережі 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 можливо зробити подібне.



-3

Я думаю, що це неможливо. Вам також потрібно буде поширити .NET FW. Якщо ви хочете скомпілювати програму .NET для власного коду, використовуйте інструмент NGen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.