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?
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
Użyłem danych wyjściowych z pliku "heat.exe myDll.dll -o mydll.wxs". Dzięki – SaulBack