2009-03-31 5 views
5

У меня есть общая dll, мы будем называть его Utility.dll, который устанавливается несколькими продуктами. В моем файле WIX я устанавливаю Utility.dll как отдельный компонент. Теперь версия 2.0 утилиты Utility.dll ссылается на дополнительную dll, UtilityUtility.dll, которую необходимо будет установить рядом.WIX добавить новый файл в общий компонент

Для моей первой попытки интеграции UtilityUtility.dll я создал новый компонент WIX, содержащий новую dll.

Это вызывает проблемы в следующем сценарии

1) Пользователь устанавливает Продукт 1 {Utility.dll 1,0}
2) Пользователь устанавливает Продукт 2 {Utility.dll 2.0, 2.0} UtilityUtility.dll
3) пользователь удалений продукт 2 {Utility.dll 2,0}

Теперь, когда пользователь использует Utility.dll он потерпит неудачу, если он не может найти указываемые UtilityUtility.dll

Это привело меня, чтобы добавить UtilityUtility.dll к оригинальный компонент, который предотвращает использование Ut ilityUtility.dll удаляется в предыдущем сценарии, но имеет собственную проблему.

1) Пользователь устанавливает Продукт 1 {Utility.dll 1,0}
2) Пользователь устанавливает Продукт 2 {Utility.dll 2.0, 2.0} UtilityUtility.dll
3) Пользователь Деинсталлирует Продукт 2 {Utility.dll 2.0, UtilityUtility .dll 2,0}
4) Пользователь удалений Продукт 1 {UtilityUtility.dll 2,0}

UtilityUtility.dll является сиротой, так как не удаляются с помощью продукта 1 удаления (она не существует в компоненте, когда он был первоначально установлен).

Есть ли у меня какие-либо другие варианты?

Thanks

ответ

3

Если вы не можете обновить Продукт 1 (который, как я полагаю, не совсем возможен), я думаю, что вы ввернуты. ИМХО, Компонентные правила - самое худшее в установщике Windows. Это link to an old blog post of mine суммирует большинство из них. Ваш случай немного отличается от того, что описано там, но результаты ожидаются.

Я думаю, вы можете выбрать меньшее из двух зол.

+0

С первым сценарием будет переустанавливаться/восстанавливаться Product1 после unistall Product2 с помощью REINSTALLMODE = a (или amus) исправлять ситуацию? У меня есть несколько аналогичный тестовый проект, и похоже, что ремонт заменяет v2 DLL на v1 –

+0

. Да, исправление Product1 с помощью REINSTALLMODE = a заставит все файлы в этом пакете на машине, потенциально нарушив любые другие общие файлы. «a» - очень жестокий молот, чтобы качать. –

+3

Сообщение Rob означает, что в отношении правил компонентов, я считаю, переместился на http://robmensching.com/blog/posts/2003/10/18/Component-Rules-101 – adamjcooper

0

Можете ли вы воспроизвести второй выпуск? В теории после того, как вы установили версию продукта 2, она станет 2.0. После версии 3 компонента версия 2.0. Когда пользователь удаляет продукт 1 на шаге 4, установщик Windows знает, как удалить Utility.dll 2.0 и UtilityUtility.dll 2.0.

Обновление: Я был неправ, извините.

+0

@Pavel в Windows Installer нет такой вещи, как «компонентная версия». Поведение, описанное выше, я ожидаю. –

+0

У меня есть репродукция. – user38309

1

Я не уверен на 100% ... но я думаю, что добавление второго .DLL к исходному компоненту, скорее всего, является «нарушением» правил компонентов. Посмотрите на: http://blogs.msdn.com/robmen/archive/2003/10/18/56497.aspx

Из того, что я собираю из толпы Wix, ведущей «лучшей практикой» является каждый файл как отдельный компонент.

Каковы ваши планы по модернизации (в терминах msi: майор, минор, патч)? Если я правильно помню, что незначительные обновления не допускаются к ошибкам с определениями компонентов. Не знаю о патчах.

Вам также может потребоваться ремонт.

+0

Мне очень хотелось бы иметь вторую dll в своем собственном компоненте, но мне нужно предотвратить ее удаление на первом этапе 3-го сценария. Я планирую выполнить основные обновления. – user38309

+0

@summergoat: Я думаю, вам может быть не повезло тогда (см. Комментарий Роба Меншинга). Вы можете спросить в списке рассылки wix ... они, как правило, полезны и глубоко осведомлены о установщике Windows (это не вопрос wix ... но вопрос установщика Windows). – user53794

0

Я сам столкнулся с этой проблемой. Я согласен с @rbobby, и я также утверждаю, что тот факт, что вы можете представить этот сломанный пользовательский сценарий, является доказательством того, что вы нарушаете правила. Вы должны обновлять только общий компонент, если он полностью и полностью совместим. Если Duck 2.0 не ошеломляет и не плавает, создайте для него новое имя.

В вашем случае у вас есть Utility.dll 1.0 и Utility.dll 2.0, но они являются только «одним и тем же компонентом», поскольку они делают подобные вещи по-другому. Utility.dll 2.0 действительно следует называть UtilityPlus.dll 1.0.

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

 Смежные вопросы

  • Нет связанных вопросов^_^