Регистрация WiX COM не удалась, но экспорт регистрационного ключа, удаление и повторный импорт работает - PullRequest
4 голосов
/ 10 февраля 2012

Я создал MSI, используя WiX.Я пытаюсь зарегистрировать компоненты .NET для COM-взаимодействия в 64-разрядной версии Windows Vista.Однако после запуска установки MSI и запуска веб-сайта, использующего эти компоненты, я вижу следующее сообщение об ошибке:

Ошибка выполнения компонента для компонента [0xC] ч: 0x0 CLSID: {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774} Не удалось создать компонент.Это может быть проблема с регистрацией компонента.

Кажется, это не вызвано обычными проблемами, и после долгих тренировок я обнаружил, что могу решить эту проблему, выполнив следующие действия:

  1. Экспорт записи реестра CLSID \ {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}.
  2. Удалите ключ и все подразделы CLSID \ {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}
  3. Повторно импортировать экспортированный файл .reg из шага 1.

После выполнения этих 3 шагов компонент будет правильно определен, и веб-приложение будет работать нормально.

Обновление: я только что экспортировал весь раздел реестра HKCR после того, как запустился мой установщик, а затем после выполнения 3 шагов, описанных выше.Выполнение diff для двух файлов не выявит различий!

Итак, мой вопрос: что мне нужно сделать, чтобы мой установщик WiX заработал?Я предполагаю, что я делаю что-то не так, но что?

К вашему сведению - я использую следующий WiX XML для создания ключей реестра (я уже пытался использовать элемент класса WiX, но это тоже не сработало)).Примечание. Var.CLSID - это переменная с HKCR \ CLSID (не Wow6432Node).

    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}" Value="Awesome.Component" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Value="mscoree.dll" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="ThreadingModel" Value="Both" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\ProgId" Value="Awesome.Component" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="Class" Value="Awesome.Component" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="Assembly" Value="AwesomeAssembly, Version=0.9.2.0, Culture=neutral, PublicKeyToken=8a030859d27c8274" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="RuntimeVersion" Value="v2.0.50727" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="CodeBase" Value="file:///[#fil7B6E8E93E37519B6844149C87BAD9C0B]" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="Class" Value="Awesome.Component" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="Assembly" Value="AwesomeAssembly, Version=0.9.2.0, Culture=neutral, PublicKeyToken=8a030859d27c8274" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="RuntimeVersion" Value="v2.0.50727" Type="string" Action="write" />
    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="CodeBase" Value="file:///[#fil7B6E8E93E37519B6844149C87BAD9C0B]" Type="string" Action="write" />

1 Ответ

1 голос
/ 11 февраля 2012

Ответ (для меня): Разрешения реестра!

После хорошего ночного сна я понял, что если запись в реестре export не отличается, ответ должен лежать в реестре разница , который не экспортируется. Конечно, одна из возможностей (возможно, единственная?) - это права доступа к реестру.

Вооружившись лучшими условиями поиска в Google, я нашел ветку Разрешения системного и COM-реестра . Этот поток объясняет, что если у вас не установлено свойство ALLUSERS WiX со значением 1 (то есть <Property Id="ALLUSERS" Value="1" />), то по умолчанию ваш установщик будет запускаться и устанавливать ключи реестра в кусте для каждого пользователя . Следовательно, почему мое веб-приложение не может их видеть (поскольку оно работает от имени другого пользователя) и не может их создать.

Мораль моей истории: Вы не можете ожидать, что Heat.exe сделает всю работу. Вы не можете просто баловаться WiX и MSI.

Хотелось бы, чтобы где-нибудь был краткий контрольный список проекта установщика WiX ...

...