MSI не может регистрировать библиотеки DLL при сборке с Windows 8 по сравнению с Windows 7

Я использую Visual Studio 2010 для создания MSI, состоящего из нескольких файлов DLL, для регистрации которых используется vsdrpCOMSelfReg. Есть также несколько служб Windows, которые устанавливаются с помощью настраиваемых действий. Моя целевая машина работает под управлением встроенного стандарта Windows 32bit.

Моя предыдущая коробка разработки работала под управлением 64-разрядной версии Windows 7, и я мог без проблем собрать и установить этот MSI. Недавно я перешел на Windows 8 Pro, и когда я собираю MSI с использованием точно такой же базы кода, я получаю ошибки «не удалось зарегистрировать» в моих библиотеках DLL, что затем приводит к сбою установки служб.

У меня есть условие запуска «Привилегированный» в MSI, которое подходит для обеих версий, поэтому похоже, что необходимые разрешения есть.

Если я установлю для DLL-файлов значение «vsdrpCOM», я смогу успешно зарегистрироваться постфактум с помощью regsvr32, но мои службы не смогут установить, потому что они полагаются на регистрацию этих DLL для завершения собственной установки.

Что мне не хватает? Что изменилось в реестре DLL между Windows 7 и Windows 8?


person Selektaa    schedule 08.07.2014    source источник


Ответы (2)


Обычной причиной этого являются отсутствующие зависимости. ComSelfReg требует, чтобы ваши библиотеки DLL загружались и запускались во время установки. Если вы включили поддержку среды выполнения VC++ в качестве модулей слияния и они устанавливаются в WinSxS, они будут недоступны до тех пор, пока не потребуется выполнить код саморегистрации. Симптомы точно такие же, как если бы среда выполнения VC++ была установлена ​​из модулей слияния и еще не существует в системе — сбой во время установки и успех с regsvr32 после установки.

В общем, вам следует рассмотреть возможность использования инструмента, который не требует кода для установки служб. Все основные инструменты установки заполняют таблицы ServiceInstall и ServiceControl в файле MSI, потому что MSI прекрасно устанавливает службы, но установки VS по какой-то причине их не используют.

person PhilDW    schedule 08.07.2014
comment
Спасибо за ответ, и я собираюсь избегать использования ComSelfReg в будущем. В моем случае это не было проблемой, но я ценю советы по передовой практике. - person Selektaa; 09.07.2014

Проблема заключалась в том, что зависимости автоматически загружались, когда я добавлял выходные данные проекта DLL. Одной из обнаруженных зависимостей была IPHLPAPI.DLL, извлеченная из C:\Windows\System32. Затем эта DLL была скопирована в каталог приложения. В моей установке Windows 8 Pro версия IPHLPAPI.DLL 6.2.9200.16420. В Windows 7 этот файл имеет версию 6.1.7600.16385.

Я предполагаю, что мои сборки ссылались на версию Windows 8, поскольку она находилась в локальном каталоге, и это вызывало ошибки регистрации и/или выполнения. Я исключил IPHLPAPI.DLL из установщика, и теперь все работает правильно, ссылаясь на файл в System32.

person Selektaa    schedule 09.07.2014