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

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

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

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

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

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

Mono:

.NET:

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

70 голосов | спросил 19 revs, 2 users 99%
Robert P
1 Jam1000000amThu, 01 Jan 1970 03:00:00 +030070 1970, 03:00:00

8 ответов


0

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

ответил 29 MarpmSun, 29 Mar 2009 17:36:35 +04002009-03-29T17:36:35+04:0005 2009, 17:36:35
0

FWIW

Mono уже давно имеет компоновщик .

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

ответил Sam Saffron 21 MaramSat, 21 Mar 2009 01:36:42 +03002009-03-21T01:36:42+03:0001 2009, 01:36:42
0

http://www.xenocode.com/

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

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

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

ответил Sam Saffron 21 MaramSat, 21 Mar 2009 01:36:42 +03002009-03-21T01:36:42+03:0001 2009, 01:36:42
0

Профиль клиента регистрируется в 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
ответил Sam Saffron 21 MaramSat, 21 Mar 2009 01:36:42 +03002009-03-21T01:36:42+03:0001 2009, 01:36:42
0

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

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

ответил Jacob Adams 21 MaramSat, 21 Mar 2009 01:35:57 +03002009-03-21T01:35:57+03:0001 2009, 01:35:57
0

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

ответил Lurker Indeed 25 MarpmWed, 25 Mar 2009 21:17:59 +03002009-03-25T21:17:59+03:0009 2009, 21:17:59
0

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

http://www.thinstall.com/

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

ответил Lurker Indeed 25 MarpmWed, 25 Mar 2009 21:17:59 +03002009-03-25T21:17:59+03:0009 2009, 21:17:59
0

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

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

ответил Lurker Indeed 25 MarpmWed, 25 Mar 2009 21:17:59 +03002009-03-25T21:17:59+03:0009 2009, 21:17:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132