Подтвердить что ты не робот

Преобразование .NET-приложения в собственный код x86

Там программа, полностью написанная на С#, которая предназначена для .NET Framework 2.0. Есть ли способ, который я мог бы каким-то образом скомпилировать (перевести) управляемый EXE на собственный, чтобы он мог быть .NET-агностиком? Я знаю, что для этой цели, вероятно, есть коммерческие продукты... но они немного дороже.

Проблема заключается в том, что мы должны развернуть программу на компьютерах под управлением Windows XP без установленной .NET Framework. Также необходимо, чтобы размер программы не превышал 500 КБ (максимум 1 Мб), поскольку он загружается с веб-сервера (теперь размер составляет 255 Кбит). Вот почему мы не могли подключить полноценный .NET FX (или даже сокращенный) к загруженному программному файлу.

Очевидно, что это ужасная ошибка в разработке программного обеспечения, которую следовало обнаружить и избежать раньше, поэтому мы могли бы использовать собственные технологии, такие как С++.

Мы сейчас пытаемся использовать Novell Mono - версию .NET Framework для Linux, MAC и Windows с открытым исходным кодом. Моно состоит из компиляторов С#, IDE, среды выполнения (CLR) и библиотеки классов (например, System.dll и mscorlib.dll - так же, как сборки библиотеки классов .NET, установленные в GAC). Мы попытались найти файлы CLR и отправить их вместе с нашим программным файлом и несколькими сборками. Таким образом, программа может быть вызвана запуском "mono program.exe" (командной строки) на компьютере пользователя. В дополнение к неудобствам такого использования для CLR файлов конечного пользователя (mono.exe и mono.dll) оказалось около 2,5 Мб, что намного превышает желаемый 500 КБ или даже 1 МБ.

Итак, мы оставили другой вариант, но перевести наше .NET-приложение на родное с помощью компилятора, однако остается открытым вопрос - какой компилятор мы должны использовать и где мы могли бы найти его...

На данный момент я наткнулся на проект ОС Singularity от Microsoft Research. Это ОС с открытым исходным кодом, которая написана в управляемом коде (по крайней мере, частично). ОС Singularity включает компилятор Bartok, который использует ОС для перевода управляемой программы на нативную (x86 32 бит). Следует отметить, что Bartok не может перевести все аспекты .NET 2.0 на собственный код, но большинство из них. Однако я еще не научился использовать сингулярность...

Я был бы вам очень благодарен, если бы вы предоставили мне несколько полезных советов и советов относительно проблемы, свой собственный опыт работы с ОС Singularity и компилятором Bartok или другие подходы к проблеме, которую я упустил, и способы ее решения.

Спасибо вам заблаговременно!

Наконец, используя функцию Mono Full AOT (по совету Callum Rogers), мне удалось создать файл program.exe.dll, в котором отсутствует заголовок CLI. Так что это выглядит как родная DLL. Однако я не могу понять, как преобразовать эту dll в exe или сделать ее работоспособной. Кроме того, эта dll не представляет каких-либо функций, таких как основная функция.

4b9b3361

Ответ 1

Отметьте AOT (Вперед времени) Компиляция из проекта Mono. Это скомпилирует ваш управляемый проект в native exe или исполняемый эльф (в зависимости от того, на какую целевую систему) не требуется JIT. Это метод, используемый для получения моно приложений на iPhone (где JIT/Framework не допускается), а также имеет дополнительные преимущества от более быстрого запуска, снижения использования памяти, и это усложняет процесс декомпиляции кода. Вы сказали, что уже используете Mono, поэтому он должен быть совместимым.

Прочитайте об этом на веб-сайте mono-project.com и в блоге Miguel de Icazaинформация о iPhone).

Обратите внимание, что вы не можете использовать динамический код или общие интерфейсы, например

interface IFoo<T> {
...
    void SomeMethod ();
}

И вам придется скомпилировать библиотеки DLL всех используемых вами библиотек.

PS: Обязательно используйте "Полный" AOT для вашей проблемы.

Ответ 2

Обновление 2017

Как комментарий @jenix,.NET Native предназначен только для приложений Windows Store (UWP). После 3 лет его анонса, это все еще так,.net native для рабочего стола может быть удален Microsoft. Поэтому этот ответ больше не применим.

Для консольных приложений вы можете использовать .net core Автономные развертывания (SCD). Даже для приложения Hello World, ваш пакет будет 50 МБ+. Тем не менее, вам все равно нужно установить среду выполнения VC.

========

Microsoft анонсировала предварительный просмотр .NET на Build 2014

С предварительным представлением .NET Developer Developer приложения будут развернуты на конечных пользователях как полностью автономный изначально скомпилированный код и не будут иметь зависимости от .NET Framework на целевом устройстве/машине. Таким образом, на целевой машине с .NET Native не требуется .NET framework.

Объявление предварительного просмотра .NET для .NET
Род Microsoft.NET

Ответ 3

Существует проект под названием CrossNet, который анализирует .Net Assemblies и генерирует неуправляемый код С++, который может быть скомпилирован в любом стандартном компиляторе.

Ответ 5

Не совсем уверен, что вы можете многое сделать, кроме того, чтобы тщательно переписать приложение. Чтобы облегчить процесс обременения, вы можете разобрать приложение .NET с помощью чего-то вроде Reflector (в Microsoft С++) и использовать его в качестве базы для запуска и просто заменить управляемые ссылки С++ на собственные.