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

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

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

3 ответа

Решение

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

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

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

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

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

Не только я буду разглагольствовать о том, что 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>

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

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

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

Как в:

 heat.exe file my.dll -out my.wxs
Другие вопросы по тегам