Состояние компоновщиков для приложений .NET («Пожалуйста, сэр, можно мне с компоновщиком», выпуск 2009 г.) - PullRequest
70 голосов
/ 21 марта 2009

Многие люди здесь, вероятно, знакомы с одним из Джоэлем Спольски самых популярных постов в блоге, Пожалуйста, сэр, могу ли я получить компоновщик , где он взывает о способе удаления зависимостей на платформе .NET, чтобы можно было разрабатывать и продавать автономное приложение.

Джейсон Цандер из команды разработчиков Visual Studio, в то время, ответил со своими взглядами на тему , утверждая, что тема несколько спорна - способность исправлять проблемы безопасности во время выполнения (среди прочих пунктов) была их главная забота. В целом, небольшие накладные расходы стоили того.

Перенесемся в 2009 год. Есть несколько групп, которые утверждают, что имеют компоновщики C #. (Джейсон Зандер даже сам сказал, что его реализация не займет много времени.) Вместо милой десятки-тысячной загрузки .NET 1.0, у нас теперь есть массивный кросс-платформенный установщик .NET 3.5 размером 200-300 МБ. который содержит версии .NET для x86, x64 и ia64. Microsoft предлагает уменьшить размер среды выполнения:

  • Распакуйте распространяемый пакет, удалите ненужные целевые платформы и соберите его вместе
  • Используйте веб-загрузчик, который загружает только библиотеки для вашей платформы
  • Используйте установщик Client Profile (новый на конец 2008 г.), который имеет ограниченные библиотеки и работает только для x86

Что еще хуже, насколько я понимаю (пожалуйста, поправьте меня, если я ошибаюсь), профиль клиента даже не регистрируется в Windows как установленный .NET 3.5. Это означает, что если на компьютере установлено несколько клиентских приложений .NET 3.5, ни одно из них не увидит друг друга, и среда выполнения будет переустанавливаться снова и снова!

Я действительно не знаю, о чем здесь думает Microsoft. Даже если предположить, что наихудший вариант установки будет для одной целевой платформы (например, x64), и нужно включать только эти библиотеки, вы по-прежнему ожидаете, что в вашем приложении будет загружено более 60 МБ. Даже одно из самых известных приложений .NET, Paint.NET, было сопряжено с трудностями при установке приложения из-за огромных зависимостей .NET. Если у них возникают проблемы с распространением бесплатного приложения, как насчет остальных? мир? В итоге им пришлось создать загрузчик, который установил Microsoft Installer 3.1, загрузчик среды выполнения .NET и все другие зависимые библиотеки , прежде чем они смогли установить свое собственное приложение.

Так как насчет этого? Линкер. Существуют ли какие-либо хорошие - или инструмент, который просто позволяет создавать приложения на C #, не требуя, чтобы пользователь установил масштабную среду выполнения .NET?

Обновление: похоже, есть несколько вариантов:

Mono:

.NET:

Похоже, инструменты Mono начинают использоваться; как насчет инструментов на основе .NET? Есть ли у них какой-то другой опыт, или нам просто нужно подождать, пока Microsoft выпустит 3.5 для всех? Страшно подумать, сколько времени потребуется для выпуска .NET 4.0 ...

Ответы [ 8 ]

49 голосов
/ 29 марта 2009

Корпус Mono Linker .

Я не могу много говорить о других программах, перечисленных здесь, но как автор Mono Linker я могу сказать, что он делает, а что нет.

Mono Linker - это только управляемый компоновщик, поэтому по определению он берет сборки и удаляет то, что не нужно для запуска программы. Он не объединяет сборки и не делает из них нативную программу.

Существует клон ILMerge Mono.Merge, но он не завершен, и его автор не поддерживает его. Для создания собственной программы, содержащей как среду выполнения Mono, так и сборки, Mono предоставляет инструмент mkbundle .

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

Я написал пару постов в блоге о компоновщике:

О нашем опыте работы с компоновщиком. Линкер в настоящее время используется в двух частях проекта Mono. Он используется для генерации сборки, которую мы распространяем, чтобы люди встраивали наш компилятор C #, Mono.CSharp.dll. Вы можете посмотреть презентацию Мигеля на PDC, в которой описано, как мы это делаем. Это довольно просто, и это основное использование Linker, который является настраиваемым инструментом, и довольно легко написать собственные шаги для него.

Более сложное использование компоновщика - это способ , в котором мы создаем наши сборки Moonlight . Moonlight, являясь нашей реализацией Silverlight, сборки являются подмножеством настольных сборок. Поэтому мы связываем наши сборки для настольных компьютеров, чтобы уменьшить их размеры, и, используя пользовательские шаги, мы трансформируем публичный API в соответствии с Silverlight.

Так что да, у Linker'а есть несколько довольно грубых краев, таких как, например, интерфейс командной строки, или тот факт, что вы должны действительно знать, что вы делаете, или вы можете получить какие-то странные сборки, но все в целом, это работает очень хорошо для нас.

5 голосов
/ 30 марта 2009

http://www.xenocode.com/

Это то, что мы используем. До сих пор, после года или до некоторого ограниченного использования (может быть, 500 установок в дикой природе), проблем ноль.

И это довольно по умеренной цене. У них есть более дорогое программное обеспечение для полной виртуализации (которое связывает ваше приложение с другими приложениями и даже O / S). Но нам не нужно все это. Наша стоимость примерно год назад составляла 400 долларов. Думаю, сейчас она немного дороже, но намного дешевле, чем Thinstall.

И у них есть отличные демоверсии, которые вы можете скачать, например IE 8. Установка не требуется.

5 голосов
/ 21 марта 2009

FWIW

У Mono был компоновщик в течение достаточно долгого времени.

Вот пример использования mkbundle.

3 голосов
/ 29 марта 2009

Профиль клиента регистрируется в Windows, но особым образом, поскольку вы не хотите путать машину только с профилем клиента с машиной с полной .net 3.5

Профиль клиента:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\DotNetClient\v3.5\Install 

Full .net 3.5:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\Install
2 голосов
/ 30 марта 2009

Я спорил (под моим псевдонимом "Мистер Аналоги") необходимость в компоновщике на форуме Джоэла, пока он не написал эту статью. Распространение линкеров, кажется, оправдало мою озабоченность (к сожалению).

http://www.thinstall.com/

От людей, с которыми я разговаривал, это довольно хорошо рассматривается, хотя в последний раз я проверял, что лицензирование было обременительным ($ 2 тыс. В год за лицензирование приложения). Похоже, они нацелены на ИТ-магазины, а не на разработчиков. Тот факт, что вы не можете найти цены на их сайте, предполагает (для меня), что это дорого.

2 голосов
/ 25 марта 2009

Никогда не использовал его, но я слышал, что вы можете делать подобные вещи с .NET Reactor

2 голосов
/ 21 марта 2009

Это основной, который я слышал давным-давно на .NET Rocks. У меня никогда не было возможности попробовать это, хотя

http://www.remotesoft.com/linker/

0 голосов
/ 29 марта 2009

В CodeProject есть отличная статья, в которой рассказывается о некоторых «компоновщиках» и о том, как они работают.

http://www.codeproject.com/KB/dotnet/internals_native.aspx

...