Как зарегистрировать Win32 COM DLL файл в WiX 3?

Я нашел пример регистрации DLL, Регистрация сборки для COM-взаимодействия в MSI-файле с помощью набора инструментов XML установщика Windows. и WiX жалуется на атрибут «AssemblyRegisterComInterop».

Я удалил это и изменил атрибут «Assembly» на win32, и он говорит, что мне нужно указать атрибут AssemblyManifest, но что мне там поставить?

12.12.2008 21:21:38
3 ОТВЕТА
РЕШЕНИЕ

Самый простой способ (и Роб М будет разглагольствовать о том, как это неправильно ) - просто использовать SelfRegCost=1тег File для DLL.

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

Это также неправильно, потому что это означает, что система установки Windows ничего не знает об этих разделах реестра, а также о том, что должно и не должно быть. Это означает, что восстановление не будет работать, и, возможно, деинсталляция не очистит должным образом, и т. Д.

В противном случае вы можете сгенерировать соответствующий код WiX, указав heat.exeна свою DLL и интегрировав ее вывод в текущий проект WiX. Вы получите различные теги Class, ProgID, TypeLib и Registry. Возможно, вам придется вручную отредактировать этот вывод, чтобы он скомпилировался.

Надеюсь, это поможет.

41
6.11.2012 09:59:46
Так в основном скопируйте / вставьте вывод из heat.exe и измените соответствующие пути и т. Д.?
Davy8 12.12.2008 21:52:47
Мне нравится помещать wxs, который создал тепло, во фрагмент, на который ссылается основной wxs. Какие варианты вы передали для обогрева, которые не регистрировали DLL.
CheGueVerra 12.12.2008 23:42:00
Мне обычно приходится перемещать теги class и progid в тег file и, возможно, редактировать некоторые ключи реестра. В частности, если DLL является .NET DLL, вам необходимо предоставить уникальные идентификаторы для ключей реестра, которые ссылаются на mscoree.dll, или вы получите коллизии с автоматически сгенерированными.
Troy Howard 13.12.2008 00:24:00
Обычно я запускаю команду heat так: heat file -gg -sfrag "C: \ path \ to \ file.dll" -o myfile.wxs ... затем включаю сгенерированный файл wxs в проект по запросу, изменяю его и ссылаюсь на корневой компонент из «основного» wxs для модуля msi / merge через componentref или componentgroupref.
Troy Howard 13.12.2008 00:26:59
Для процесса сборки я автоматизировал ручное редактирование с помощью пользовательских скриптов. Я предлагаю вам сделать то же самое ...;)
Troy Howard 13.12.2008 00:29:19

Не только я буду разглагольствовать о том, что SelfReg является злом. MSI SDK дает список из семи причин, почему не следует использовать SelfReg .

Пример:

<Component Id="Component" Guid="*">
    <File Source="ComServer.dll">
        <Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description">
            <ProgId Id="Your.Server.1" Description="Your ProgId description">
                <ProgId Id="Your.Server" Description="Your ProgId description" />
            </ProgId>
        </Class>

        <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them">
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" />
        </Class>
    </File>
</Component>

В конечном итоге, ответ Троя верен.

25
6.11.2012 08:38:00
Самостоятельная регистрация считается вредной (простите за Дийкстра-аллюзию).
Stein Åsmul 6.05.2015 19:50:14

Вы можете попробовать использовать программу heat.exe, а затем сослаться на фрагмент в своем коде wix.

 heat.exe file <filename> -out <output wxs file>

Как в:

 heat.exe file my.dll -out my.wxs
13
27.02.2009 23:36:04
добавить, как использовать фрагмент
Theodosius Von Richthofen 8.02.2019 18:07:38