Как вы регистрируете Win32 COM DLL файл в WiX 3? - PullRequest
34 голосов
/ 13 декабря 2008

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

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

Ответы [ 3 ]

41 голосов
/ 13 декабря 2008

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

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

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

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

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

24 голосов
/ 13 декабря 2008

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

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

14 голосов
/ 28 февраля 2009

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

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

Как в:

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