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

Моя проблема:

Я создал два модуля слияния. Давайте назовем их A и B. Модуль слияния B зависит от A. A устанавливает aaa.dll в Windows рядом друг с другом. B содержит bbb.dll, который регистрируется во время установки и зависит от aaa.dll. Как модуль побочного примечания A был создан в 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, которая снова содержит A. Я сделал все 3 функции, необходимые. Я надеялся, что это будет означать, что вся функция завершит установку и поместит aaa.dll в правильном расположении рядом. Однако не такая удача. (Я создал 3 объекта на тот случай, если у меня был заказ назад или что-то в этом роде)
  2. Я совершенно уверен, что проблема в том, что aaa.dll просто не установлен вовремя или в нужном месте. Чтобы проверить это, я сначала попытался установить aaa.dll, используя установочный щит установки, который только что установил модуль слияния А. Затем я запустил мой основной установщик, и все заработало.

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам