Некоторое время я искал способ компилировать сборку .NET для указанной целевой платформы.
Цель состоит в том, чтобы IL и вся сборка были скомпилированы в независимый от среды выполнения .NET автономный исполняемый файл.
Я прочитал много статей и комментариев о том, почему это нельзя сделать, но мне любопытно — может кто-нибудь придумать какую-нибудь идею?
ОБНОВИТЬ: Microsoft анонсировала предварительный просмотр .NET Native. Увидеть Вот.
Согласно Часто задаваемые вопросы:
В: Как работает связывание? Код фреймворка скомпилирован в приложение?
A: Да, код структуры будет скомпилировано в приложение
Теперь это звучит захватывающе. Мне интересно узнать о BuildDefinitions и пользовательских оптимизациях (в настоящее время используется VC ++ opt.).
Если ваша сборка .NET может работать в Mono, можно использовать Mono для создания исполняемого файла, который запускается без необходимости иметь конечный пользователь .NET Framework или Mono. И на самом деле, я знаю нескольких разработчиков (включая меня), которые делают это (в первую очередь для целевых платформ * nix, но это может быть сделано и для Windows).
Первое, что следует отметить, .NET Framework 2.0 был включен как часть установки Windows начиная с Windows XP. Если вы можете использовать этот фреймворк, очень немногим пользователям Windows потребуется установить .NET Framework для запуска вашего приложения. Я бы воспользовался этим вариантом, если это вообще возможно.
Если это невозможно, я бы использовал Mono’s mkbundle
инструмент. mkbundle
создает собственный исполняемый файл для платформы, на которой он запущен. К сожалению, у меня нет точных шагов для запуска его в Windows; Я использовал его только на Linux и Mac.
Мне запрещено комментировать (у меня нет 50 баллов репутации), но я являюсь создателем CodeRefractor, поэтому я хочу уточнить об этом проекте:
Я думаю, что Mono и флаг —full-aot — лучшая цель, чем CodeRefractor, поскольку Mono коммерчески поддерживается и имеет на первый взгляд больше ресурсов (читай: разработчики, работающие над всеми компонентами среды выполнения) и более длинную историю
CR — это бесплатный / хобби-проект, и он останется таковым, потому что я не вижу многих участников вне себя (на самом деле ни одного, за исключением комментариев: пожалуйста, добавьте это, или CR справится с этим). Только по этой причине меня больше интересовало, как оптимизировать коды операций CIL, и меньше, чтобы быть надежной реализацией .Net. Также я буду использовать дизайн проекта в качестве бакалавра
для очень интенсивного математического кода и если вы хотите профилировать сгенерированный код на C / C ++, CodeRefractor может помочь вам в этом, но реальная библиотека времени выполнения очень ограничена. Возможно, вам придется написать свои собственные библиотеки PInvoke для потоковой передачи данных. Что, честно говоря, немного сложно!
CR имеет хорошие значения производительности по умолчанию: если код следует некоторым простым правилам, он, вероятно, будет иметь производительность в диапазоне компилятора Java-сервера или оптимизированного вручную C ++. Одной из причин также является то, что CR не проверяет диапазон циклов и не имеет исключений. Так что, если вам повезет, вы сможете добиться действительно хороших результатов!
CodeRefractor имеет интересные оптимизации, по крайней мере, с теоретической точки зрения. Это означает, что вы можете получить действительно хорошую производительность, если действительно попытаетесь понять, какие оптимизации выполняются. Он работает очень похоже на LTO в компиляторе GCC и является многоуровневой оптимизацией, которая особенно хорошо работает, если вы используете константы, они будут оптимизированы, включая мертвый код!
CodeRefractor как цель состоит в том, чтобы удалить зависимость .Net, предлагая (несколько) читаемый код C ++, который можно по крайней мере скопировать / вставить в ваш код C ++ или настроить его при необходимости. Это также означает, что всегда будут некоторые крайние случаи, когда C ++ не будет корректно отображать код CIL, как в области многопоточности (с volatiles)
Итак, окончательный ответ: посмотрите на моно и флаг —full-aot. Было бы замечательно, если CodeRefractor будет работать для вас, но я был бы очень впечатлен, если он будет работать, как сейчас! Может быть, через 3-4 года, если люди поддержат это (или компанию, которая знает), иначе просто прочитайте это для блога, как это делает большинство людей.
Если вас интересует дизайн CR, вы можете прочитать его в папке с документацией:
https://github.com/ciplogic/CodeRefractor/blob/master/Documentation/BarchelorPaper2014.docx
Я использую Portable Class Libraries (PCL), и они отлично работают. По сути, это подмножество .Net, которое может работать на нескольких устройствах (оно было специально разработано для этой цели).
Вы можете использовать Linq, async / await, lambdas и т. Д., Поэтому у вас есть все возможности синтаксиса C #.
Единственное предостережение: многие библиотеки .Net недоступны (например, криптография); Обходной путь обычно — найти версию библиотеки в Nuget, портированную на PCL, или воспроизвести некоторые функции .Net самостоятельно.
— Это ограничение фактически поощряется Microsoft, так как они утверждают, что ваш PCL должен использовать внедрение зависимостей из других ваших библиотек, чтобы включить недостающие функции. Например, ваш проект XBox может реализовать библиотеки шифрования, отсутствующие на PCL, и ваш проект PCL должен быть внедрен для использования классов XBox во время выполнения (через интерфейсы и т. Д.); позже вы можете сделать что-то подобное для Android, и ваша библиотека Android добавит библиотеку шифрования в ПЛК, но сама логика ПЛК не потребует изменений и будет одинаковой как для проектов XBox, так и для проектов Android.
Вот больше информации об этом http://msdn.microsoft.com/en-us/library/vstudio/gg597391(v=vs.110).aspx
Это приложение .NET, оно будет зависеть от среды выполнения .NET. Это всего лишь несколько вещей:
Компилирование всего этого в одно приложение не является практичным, желательным или действительно невозможным. Вы также можете упаковать .NET Framework в свое приложение и просто установить его (рекомендуемый подход). Я считаю, что вам даже нужно установить с моно (по той же причине, я уверен).
Я знаю, что вы искали другое решение, но реальный ответ заключается в том, что .NET не поддерживает этот тип компиляции.
На самом деле существуют некоторые инструменты для преобразования кода c # в код c ++, на самом деле инструкции il в код c ++. Затем вы можете скомпилировать код C ++ напрямую. Но в настоящее время он находится в разработке, и для его использования может потребоваться некоторое время.
Он называется Code Refractor и доступен здесь:http://coderefractor.blogspot.ro/search?updated-min=2014-01-01T00:00:00-08:00&обновлены-макс = 2015-01-01T00: 00: 00-08: 00&макс-результаты = 10