Состояние линкеров for.NET приложения (ака "Пожалуйста, сэр, можно мне Линкер" 2009 издание)


многие люди здесь, вероятно, знакомы с одним из Joel Spolsky самые популярные сообщения в блоге,Пожалуйста, сэр, можно мне Линкер, где он кричит о способе удаления зависимостей от .NET framework, чтобы можно было разрабатывать и продавать автономное приложение.

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

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

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

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

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

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

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

моно:

.NET:

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

8 70

8 ответов:

случае Mono Linker.

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

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

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

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

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

о нашем опыте работы с компоновщиком. Компоновщик в настоящее время используется в двух частях Монопроекта. Он используется для создания сборки, которую мы распространяем для людей, чтобы встроить наш компилятор C#, Mono.CSharp.файл DLL. Вы можете смотреть Мигель!--2--> в PDC, который описывает, как мы это делаем. Это довольно просто, и это основное использование компоновщика, который является настраиваемым инструментом, и для него довольно легко писать пользовательские шаги.

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

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

FWIW

моно есть у линкера довольно долго.

здесь пример о том, как использовать mkbundle.

http://www.xenocode.com/

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

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

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

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

клиентский профиль:

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

в полном объеме .net 3.5 с:

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

Это главный, о котором я слышал давно на .NET Rocks. Я никогда не получал изменения, чтобы попробовать его, Хотя

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

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

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

http://www.thinstall.com/

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

есть отличная статья о CodeProject, которая рассказывает о некоторых из "линкеров" и как они работают.

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