Установите проблемы зависимости модуля Shield-Merge. Длл не регистрируется - PullRequest
1 голос
/ 12 октября 2011

Мой выпуск:

Я создал два модуля слияния. Давайте назовем их A и B. Модуль слияния B зависит от A. A устанавливает aaa.dll в Windows рядом друг с другом. B содержит bbb.dll, который регистрируется во время установки и зависит от aaa.dll. Как модуль слияния примечаний стороны был создан в Install shield 2012, и модуль слияния B был создан с помощью мастера Visual Studio 2010.

У меня есть проект установки щита, который устанавливает оба модуля слияния. Я захожу в Application Data-> Redistributables и добавляю B к установке. Это автоматически проверяет А. Если я захожу в «Организация-> Настройка дизайна» и раскрываю функцию, содержащую B, то нажимаю «B.». Откроется окно с информацией о B. В ней есть заголовок «Зависимости», в котором правильно указан A.

Я строю проект и пытаюсь установить его на чистую ВМ. Во время установки я получаю сообщение об ошибке, в котором говорится, что bbb.dll не удалось зарегистрировать. Я хочу игнорировать, отменить. В этот момент я посмотрел в winsxs на машине и заметил, что aaa.dll не существует в правильной папке. Скорее, он существует в подпапке winsxs \ InstallTemp \. Затем, если я нажимаю игнорировать во всплывающем окне с ошибкой, установка продолжается без дальнейших ошибок. Затем, после его завершения, я могу вручную зарегистрировать bbb.dll, и aaa.dll существует в соответствующей подпапке winsxs.

У меня вопрос, как мне заставить модуль слияния A полностью завершить работу и поместить aaa.dll в правильное место, чтобы все было установлено правильно?

Вещи, которые я пробовал:

  1. Я попытался сделать несколько функций в проекте Install Shield под Организация-> Настройка дизайна. Итак, я создал 3 функции. Особенность 1 в верхней части, которая просто содержит A. Особенность 2, которая содержит A, а затем B. Наконец функция 3, которая снова содержит А. Я сделал все 3 функции требуется. Я надеялся, что это будет означать, что вся функция будет Закончите установку и поместите aaa.dll в правильную бок о бок место нахождения. Однако не такая удача. (Я создал 3 функции на всякий случай У меня был заказ в обратном направлении или что-то)
  2. Я вполне уверен, что проблема в том, что aaa.dll просто нет установлен вовремя или в нужном месте. Чтобы проверить это, я сначала попытался установить aaa.dll, используя установщик щита установки, который только что установил модуль слияния А. Затем я запустил мой основной установщик, и все заработало.

Извините за стену текста и любую неправильную грамматику \ орфографию. Я опубликую, если выясню проблему самостоятельно, на случай, если кто-то в конечном итоге столкнется с этой проблемой, потому что это действительно расстраивает.

1 Ответ

3 голосов
/ 13 октября 2011

Файлы, нацеленные на WinSXS и GAC, фактически не устанавливаются до выполнения фазы фиксации, поскольку публикуемый ими API не поддерживает операции отката.Это означает, что если вы используете Самостоятельную регистрацию в DLL, которая зависит от файла, идущего в WinSxS, он не будет работать, потому что у вас есть состояние гонки.B.DLL попытается выполнить LoadLibrary () для A.DLL при вызове DllRegisterServer, но не найдет его.

Несколько обходных путей:

1) Не использовать самостоятельную регистрацию,Извлеките данные COM во время проектирования или сборки, как рекомендуется.

2) Разверните A.DLL в другой каталог, например INSTALLDIR.

3) Оберните A.DLL в свой собственныйMSI и подключите его к MSI в качестве предварительного условия установки.Это установит A в своей собственной транзакции перед началом установки MSI.

...