Jak zarejestrować plik DLL Win32 COM w WiX 3?

Znalazłem przykład rejestracji bibliotek DLL, Rejestracja montażu dla COM Interop w pliku MSI za pomocą zestawu narzędzi Windows Installer XML., WiX narzeka na atrybut "AssemblyRegisterComInterop".

Usunąłem to i zmieniłem atrybut "Assembly" na win32 i pisze, że muszę podać atrybut AssemblyManifest, ale co tam umieścić?

Author: Peter Mortensen, 2008-12-12

3 answers

Najprostszym sposobem (i Rob M będzie narzekać i bredzić o tym, jak to jest źle ) jest użycie SelfRegCost=1 na znaczniku pliku DLL.

To jest złe, ponieważ powinniśmy wyraźnie kontrolować rejestrację DLL, nie pozwalając jej tylko na uruchamianie dowolnego kodu przez DllRegisterServer. Istnieje teoria, że DLL nie powinien robić nic poza umieszczeniem odpowiednich wpisów w rejestrze, gdy wywoływany jest DllRegisterServer. Niestety, wielu z nich robi więcej, więc samodzielna rejestracja może być jedynym sposobem na uruchomienie instalacji.

Jest to również złe, ponieważ oznacza to, że system instalacyjny Windows nie wie nic o tych kluczach rejestru i co powinno, a czego nie powinno tam być. Oznacza to, że naprawa nie zadziała, a być może un-instalacja nie wyczyści prawidłowo itp.

W przeciwnym razie możesz wygenerować odpowiedni kod WiX wskazując {[1] } na bibliotekę DLL i integrując jej wyjście z aktualnym projektem WiX. Dostaniesz różnorodność klas, typów i znaczników rejestru. Być może trzeba będzie ręcznie edytować to wyjście, aby je skompilować.

Mam nadzieję, że to pomoże.
 42
Author: Troy Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-06 09:59:46

Nie tylko ja będę rantować i zachwycać się tym, jak SelfReg jest zły. MSI SDK daje listę siedem powodów, dla których nie należy używać SelfReg.

Przykład:

<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>
Ostatecznie odpowiedź Troya jest poprawna.
 25
Author: Rob Mensching,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-06 08:38:00

Możesz spróbować użyć ciepła.programu exe, a następnie odwołać się do fragmentu w kodzie wix.

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

Jak w:

 heat.exe file my.dll -out my.wxs
 13
Author: Adam Tegen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-27 23:36:04