Можете ли вы скомпилировать С#, чтобы она не нуждалась в .NET Framework во время выполнения?

Можно ли заставить компилятор С# вытащить все ссылочные вызовы из фреймворка и упаковать их в DLL или даже один исполняемый файл?

Мне нравится писать быстрые "одноразовые" приложения с С#, однако я не хочу устанавливать всю структуру на целевой машине, как только она будет готова.

Ответ 1

Вы задаете загруженный вопрос. С# - это просто язык и не требует .NET Framework. Для его компиляции требуется компилятор, который может или не может сам зависеть от .NET Framework (компилятор Microsoft С# не записывается в собственный код). Ваша программа должна будет ссылаться на некоторые сборки, где типы, классы и методы могут быть найдены для вашего использования. Вы можете удалить system.dll и mscorlib.dll из списка ссылок и ссылаться на свои собственные сборки. Таким образом, вы можете избежать зависимостей от .NET Framework, если вы действительно работаете над этим. Но в конце концов, если у вас нет компилятора С#, который компилирует программы на собственный код, у вас все еще есть зависимость от CLR.

Это очень технический способ сказать... почти ничего. Но он отвечает на ваш вопрос.:) Более практично, однако, как заставить ваши программы на С# работать с минимальными зависимостями. mkbundle от mono фактически позволит вам скомпилировать все это в .exe практически без зависимостей.

Но если вы хотите придерживаться Microsoft.NET Framework, вы можете добиться гораздо более легкого отслеживания и более быстрой установки зависимостей, которые вам обычно нужны, используя профиль клиента .NET 3.5 SP1. Вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/cc656912.aspx

Ответ 2

Посмотрите mkbundle с помощью Mono.

Ответ 3

Взгляните на профиль клиента .NET. Это позволит вам упаковать минимальную установку на клиентский компьютер.., который позже будет обновляться обновлением Windows до полной структуры.

Это зависит, конечно, от вашего приложения, только используя библиотеки, которые содержатся в профиле клиента...

Некоторая информация здесь: http://blogs.windowsclient.net/trickster92/archive/2008/05/21/introducing-the-net-framework-client-profile.aspx

Ответ 4

Он сказал, что это возможно, используя сторонние инструменты, такие как http://www.remotesoft.com/linker/

Ответ 5

Теперь можно скомпилировать С# на собственный код с помощью Microsoft.NET Native: https://msdn.microsoft.com/en-us/library/dn584397(v=vs.110).aspx

Он автоматически компилирует выпускную версию приложений, написанных в управляемом коде (С# или Visual Basic), и которые нацелены на .NET Framework и Windows 10 на собственный код.

...

Для пользователей ваших приложений .NET Native предлагает следующие преимущества:

• Быстрое выполнение

• Последовательное ускорение времени запуска

• Низкие затраты на развертывание и обновление

• Оптимизированное использование памяти приложения

Это работает только с Visual Studio.NET 2015.

Ответ 6

Невозможно. Ваше "скомпилированное" приложение С# - это язык, который интерпретирует CLI.Net(должен был сказать JITed, считывает IL, компилирует собственный код и затем вызывает скомпилированный собственный код) во время выполнения.

FYI.net 2.0 - стандартная установка на xp SP2 и vista, поэтому вы не будете платить большую часть штрафа.

Вы можете посмотреть в моно, но это все еще связано с запуском какой-то структуры на вашей целевой машине.

Ответ 7

Эта зависимость, которая, к сожалению, часто нарушается или отсутствует в реальном мире, является большой причиной того, что С# не имеет более широкого применения. С другой стороны, у большинства разработчиков есть зависимости. Посмотрите, например, на С++ и Java.

Я не думаю, что в ближайшее время мы действительно избавимся от этих проблем с зависимостями, поэтому я рекомендую, чтобы, если вы хотите использовать С#, вы создаете оболочку для установки, которая проверяет, нужна ли вам зависимость версии .net framework, и если они отсутствуют, сообщите пользователю, что они нуждаются в этом, чтобы запустить приложение.

Ответ 8

Некоторые функции С# привязаны к интерфейсам платформы .NET.

Например:

yield return требуется интерфейс IEnumerable

using (x) {} требуется интерфейс IDisposable