Многие люди здесь, вероятно, знакомы с одним из Joel Spolsky самых популярных сообщений в блогах, Пожалуйста, сэр, могу ли я иметь компоновщик, где он кричит о способе удаления зависимостей от платформы .NET, поэтому можно разрабатывать и продавать автономное приложение.
Джейсон Зандер команды разработчиков Visual Studio, в то время ответил со своими взглядами на эту тему, утверждая, что эта тема несколько спорная - их основная проблема связана с возможностью исправлять проблемы безопасности во время выполнения (в том числе в других местах). В целом, небольшие накладные расходы стоили того.
Ускорьтесь до 2009 года. Там есть несколько групп, которые утверждают, что имеют С# -ликеров. (Джейсон Зандер даже сказал себе, что для реализации этого не потребуется много.) Вместо милой, дюжины мега-загрузки .NET 1.0, теперь у нас есть массивный кросс-платформенный комплект для установки .NET 3.5 200 МБ который содержит версии .NET для x86, x64 и ia64. Рекомендации Microsoft по сокращению времени выполнения включают:
Хуже того, как я понимаю (пожалуйста, поправьте меня, если я ошибаюсь), профиль клиента даже не регистрируется в Windows с установленным .NET 3.5. Это означает, что если на компьютер установлено несколько клиентских приложений .NET 3.5, ни один из них не увидит друг друга, и среда выполнения будет повторно установлена снова и снова!
Я действительно не знаю, что думает здесь Microsoft. Даже если предположить, что в худшем случае установка будет для одной целевой платформы (например, x64), и только эти библиотеки должны быть включены, вы по-прежнему смотря вверх на 60 мб накладных расходов на вашем приложении. Даже одно из самых известных .NET-приложений Paint.NET было чревато Трудности установки приложения из-за огромных зависимостей .NET. У них есть проблемы с распространением бесплатного приложения, а как насчет остального мира? В конце концов, они должны были сделать загрузочный загрузчик, который установил Microsoft Installer 3.1, загрузочную загрузку среды выполнения .NET и все другие зависимые libraires, прежде чем они смогут установить собственное приложение.
Итак, как насчет этого. Линкер. Существуют ли какие-либо хорошие - или инструмент, который просто позволяет создать приложение С#, не требуя, чтобы пользователь установил массовое время выполнения .NET?
Обновление: так, похоже, есть несколько вариантов:
Mono:
.NET:
Похоже, что инструменты Mono используются; как насчет инструментов на базе .NET? Любой другой опыт с ними, или нам просто придется ждать, пока Microsoft вытащит его 3.5 для всех? Я содрогаюсь, чтобы подумать, сколько времени потребуется для .NET 4.0...
Случай Mono Linker.
Я не могу много говорить о других частях программного обеспечения, которые перечислены здесь, но, как автор Mono Linker, я могу сказать, что он делает, а что нет.
Mono Linker - это только управляемый компоновщик, поэтому по определению он принимает сборки и удаляет то, что не нужно для запуска программы. Он не объединяет сборки вместе, и он не выводит из них родную программу.
Там есть клон Mono.Merge из ILMerge, но он не завершен, и его автор не поддерживает его. Чтобы создать собственную программу, содержащую как исполняемые файлы Mono, так и сборки, Mono предоставляет инструмент mkbundle.
Кроме того, поскольку это только управляемый инструмент, который изменяет сборки, если вы даете ему сильные сборки с именами, и что у вас нет закрытых ключей для их подписания, у вас будут проблемы с этими сборками.
Я написал пару сообщений в блоге о компоновщике:
О нашем опыте работы с Linker. В настоящее время Linker используется в двух частях проекта Mono. Он использовался для генерации сборки, которую мы распространяем для людей, чтобы внедрить наш компилятор С#, Mono.CSharp.dll. Вы можете посмотреть презентацию Мигеля в PDC, в которой описывается, как мы это делаем. Это довольно просто, и это базовое использование Linker, которое является настраиваемым инструментом, и довольно легко написать для него специальные шаги.
Более сложное использование Linker - это способ мы создаем наши сборки Moonlight. Moonlight, являющийся нашей реализацией Silverlight, сборки являются подмножеством настольных сборок. Поэтому мы связываем наши сборки на рабочем столе, чтобы уменьшить их размеры, и используя пользовательские шаги, мы преобразуем открытый API в соответствие с Silverlight.
Итак, у Linker есть некоторые довольно грубые грани, например, например, интерфейс командной строки или тот факт, что вы действительно должны знать, что делаете, или вы можете столкнуться с некоторыми странными сборками, но все в целом, это работает очень хорошо для нас.
Это то, что мы используем. Пока, через год или несколько ограниченное использование (возможно, 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
Я был аргументировал (под моим псевдонимом "Mr Analogy" ) необходимость в компоновщике на форуме Joel некоторое время, прежде чем он написал эта статья. По-видимому, распространение линкеров оправдывало мою озабоченность (к сожалению).
От людей, с которыми я разговаривал, это довольно хорошо расценено, хотя в последнее время я проверил, что лицензирование было обременительным (2 тыс. долл. США на год за лицензию на приложение). Кажется, они ориентируются на ИТ-магазины, а не на разработчика. Тот факт, что вы не можете найти цены на своем сайте, предлагает (мне), что это дорого.
Никогда не использовал его, но я слышал, что вы можете делать похожие вещи с .NET Reactor
Это главный, о котором я давно слышал о .NET Rocks. У меня никогда не было изменений, чтобы попробовать, хотя
В CodeProject есть отличная статья, в которой рассказывается о некоторых "компоновщиках" и о том, как они работают.