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

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

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

8 ответов

Решение

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

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

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

Посмотрите на mkbundle, используя Mono.

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

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

...

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

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

• Постоянно быстрое время запуска

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

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

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

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

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

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

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

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

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

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

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

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

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

Например:

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

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

Другие вопросы по тегам