Как вы регистрируете DLL файл Win32 COM в WiX 3?

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

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

Ответ 1

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

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

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

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

Я надеюсь, что это поможет.

Ответ 2

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

В конечном счете, ответ Трой все правильно.

Ответ 3

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

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

Как в:

 heat.exe file my.dll -out my.wxs