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

67

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

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

Ускорьтесь до 2009 года. Там есть несколько групп, которые утверждают, что имеют С# -ликеров. (Джейсон Зандер даже сказал себе, что для реализации этого не потребуется много.) Вместо милой, дюжины мега-загрузки .NET 1.0, теперь у нас есть массивный кросс-платформенный комплект для установки .NET 3.5 200 МБ который содержит версии .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 и все другие зависимые libraires, прежде чем они смогут установить собственное приложение.

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

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

Mono:

.NET:

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

  • 0
    Разве у ILMerge нет такой опции?
  • 0
    Ты так прав !!! Установщик драйвера веб-камеры (сам 42M) от Microsoft зашел на веб-сайт и загрузил .NET 3.0 - на ADSL 1,5 М потребовалось более 10 минут ... Что меня просят - использовать только веб-камеру ...
Показать ещё 4 комментария
Теги:
linker
mono

8 ответов

49
Лучший ответ

Случай 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 есть некоторые довольно грубые грани, например, например, интерфейс командной строки или тот факт, что вы действительно должны знать, что делаете, или вы можете столкнуться с некоторыми странными сборками, но все в целом, это работает очень хорошо для нас.

  • 22
    +10 за крутизну и написание моно линкера :)
  • 2
    компоновщик также используется для Monotouch, чтобы обойти тот факт, что Apple не разрешит (байт-код) интерпретаторы и виртуальные машины для установки на iphone
Показать ещё 1 комментарий
5

http://www.xenocode.com/

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

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

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

5

FWIW

Моно долгое время имел компоновщик.

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

  • 0
    Как бы ни был линкер :), здесь он не решает конкретную проблему. Mono's Linker - это управляемый, который работает только на управляемых сборках.
  • 0
    Хорошо, тогда проверьте mkbundle-- linux.die.net/man/1/mkbundle .
Показать ещё 2 комментария
3

Регистр клиента регистрируется в 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
2

Я был аргументировал (под моим псевдонимом "Mr Analogy" ) необходимость в компоновщике на форуме Joel некоторое время, прежде чем он написал эта статья. По-видимому, распространение линкеров оправдывало мою озабоченность (к сожалению).

http://www.thinstall.com/

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

2

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

2

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

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

  • 0
    ссылка кажется мертвой
  • 0
    Я только что попробовал это. Это работало хорошо для меня.
Показать ещё 1 комментарий
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню