Можете ли вы скомпилировать C #, чтобы он не нуждался в .NET Framework во время выполнения? - PullRequest
29 голосов
/ 15 февраля 2009

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

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

Ответы [ 8 ]

38 голосов
/ 15 февраля 2009

Вы задаете загруженный вопрос. 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

14 голосов
/ 15 февраля 2009

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

8 голосов
/ 29 октября 2015

Теперь возможно компилировать 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.

5 голосов
/ 15 февраля 2009

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

5 голосов
/ 15 февраля 2009

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

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

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

1 голос
/ 15 февраля 2009

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

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

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

0 голосов
/ 06 августа 2013

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

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

0 голосов
/ 16 февраля 2009

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

Например:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...