2011-10-18 9 views
10

Tło:Rejestracja .NET COM DLL podczas Wix zainstalować

Nasza aplikacja jest plugin do znacznie większego zastosowania. Wszystko, co tworzymy, to pliki DLL, do których hakuje szersza aplikacja. Z tego względu nasze pliki .NET (C#) muszą być zarejestrowane dla interfejsu COM.

Mamy działający projekt: InstallShield, ale z wielu powodów, których nie będę tu wprowadzać, chcemy przenieść go do WiX. Jedyne, co pozostało do zrobienia dla instalatora, to zarejestrować nasze pliki DLL dla COM.

Problemy

Oto przykładowy element z pojedynczego pliku DLL.

<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" > 
    <File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net" 
      AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" /> 
</Component> 

Zgodnie z przyjętą odpowiedzi z How do you register a Win32 COM DLL file in WiX 3?, zaleca się, aby dodać SelfRegCost=1 do znacznika pliku. Powoduje to błąd podczas instalacji:

Moduł C: \ Program files \ Product \ MyDll.dll nie został zarejestrowany. HRESULT -2147024769. Skontaktuj się z obsługą techniczną.

Druga odpowiedź na to samo pytanie (Rob Menshing) zaleca wobec tego podejścia, ale na dodatek wewnątrz znacznika plików to:

<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> 

jestem trochę zdezorientowany, aby umieścić w jak Identyfikatory CLSID. Wstawiam wygenerowany identyfikator GUID i zainstaluję go. Zainstalował się dobrze, ale większa aplikacja nie mogła znaleźć plików DLL. (I stosuje się znaczniki interfejsu wygenerowane heat.exe).

innego podejścia znajdujący się w tej samej kwestii (o Adan tegen) zaleca użycie plik heat.exe myDll.dll wymeldowanie my.wxs

Za pomocą wyjścia, i dodać do znacznika pliku:

<TypeLib Id="Another Guid" Language="0" MagorVersion="1"> 
    <!--Interfaces generated from heat.exe--> 
</TypeLib> 

Każdy sposób starałem się zarejestrować NET COM nie powiodła się i po przeczytaniu tak wiele pytań na ten temat nie będę bliżej wiedząc prawidłowy sposób robi to jestem. Co powinienem zrobić? Dlaczego to takie trudne zadanie, gdy wszystko inne w WiX jest dość proste?

Należy wspomnieć, że oryginalny projekt InstallShield utworzył niestandardową akcję, która będzie wywoływać regasm.exe. Jeśli wszystko inne zawiedzie, może to być możliwe, ale wolałbym robić wszystko dobrze.

Po prostu stwierdziłem, że heat.exe file myDll.dll -scom -o myDll.wxs daje wartości rejestru podobne do potrzebnych. Teraz, jak mogę odwołać się do nowo utworzonego komponentu wewnątrz składnika DLL?

Odpowiedz

9

Po prostu stwierdziłem, że heat.exe file myDll.dll -scom -o myDll.wxs daje wartości rejestru podobne do potrzebnych.

Czy jesteś pewien, że istnieje -scom? AFAIK, ta opcja faktycznie tłumi rejestrację COM!

Jak mogę teraz odwołać się do nowo utworzonego komponentu wewnątrz komponentu DLL?

Element wygenerowany przez heat.exe zawiera już element File dla biblioteki DLL. W rzeczywistości zawiera wszystko, co potrzebne do zainstalowania i zarejestrowania pliku DLL. Nie potrzebujesz oryginalnego "komponentu DLL".

Jeśli musisz umieścić plik i jego rejestrację COM w oddzielnych komponentach, będziesz musiał usunąć element File ze składnika wygenerowanego przez heat.exe.

Ponadto komponenty nie mogą odwoływać się do innych komponentów. Możesz mieć odniesienia między ComponentGroup s, coś, co używamy ciężko w naszych wixlibs do model dependencies, ale jest to raczej zaawansowany przypadek użycia.

+0

Tak więc w moim po prostu dodaję ? Co powinno mieć moje polecenie heat.exe? The -scom był z sugestii, którą znalazłem podczas googlowania. Myślałem, że tłumienie COM było dziwne, ale dało mi to CSLID-y, których się spodziewałem. heat.exe plik myDll.dll -o mydll.wxs? – SaulBack

+0

Użyłem danych wyjściowych z pliku "heat.exe myDll.dll -o mydll.wxs". Dzięki – SaulBack