我們的應用程序是一個更大的應用程序的插件。我們創建的所有東西都是大型應用程序所連接的DLL文件。由於我們的.NET(C#),DLL文件必須註冊爲COM接口。
我們有一個工作InstallShield項目,但由於很多原因,我不會在這裏進入,我們希望將其遷移到WiX。爲安裝程序完成的唯一工作就是註冊我們的COM文件的DLL文件。
問題
這裏是具有單個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>
爲每How do you register a Win32 COM DLL file in WiX 3?接受的答案,建議增加SelfRegCost=1
到文件標記。這會導致安裝過程中出現錯誤:
模塊C:\ Program files \ Product \ MyDll.dll註冊失敗。 HRESULT -2147024769。請聯繫您的支持人員。
在同一個問題的第二個答案(由羅布Menshing)建議反對這一做法,但這個文件標籤中添加:
<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>
我有點困惑,投入作爲CLSID ID。我放入一個生成的GUID並安裝它。它安裝得很好,但較大的應用程序找不到DLL文件。 (I用於從heat.exe
生成的接口代碼。)
在同樣的問題中發現的另一種方法(由亞當Tegen)建議使用 heat.exe文件將myDll.dll -out my.wxs
使用輸出,我想補充這文件標籤:
<TypeLib Id="Another Guid" Language="0" MagorVersion="1">
<!--Interfaces generated from heat.exe-->
</TypeLib>
每個方面我曾嘗試註冊.NET的COM失敗和閱讀,我沒有接近知道這樣做的正確方法的話題這麼多問題之後。我該怎麼辦?爲什麼在維克斯的其他一切相當簡單時,這是一項如此艱鉅的任務?
我應該提到的是,原來的InstallShield項目中創建一個自定義操作,將調用regasm.exe
。如果一切都失敗了,這可能是一種可能性,但我寧願做正確的事情。
我剛剛發現heat.exe file myDll.dll -scom -o myDll.wxs
輸出註冊表值相似,我需要什麼。現在,我如何引用DLL組件中新創建的組件?
所以在我的我只是添加?我的heat.exe命令應該是什麼? -scom來自我在Google上搜索時發現的一條建議。我認爲壓制COM很奇怪,但它給了我期望的CSLID。 heat.exe文件myDll.dll -o mydll.wxs? –
SaulBack
我使用了「heat.exe文件myDll.dll -o mydll.wxs」的輸出。謝謝 – SaulBack