2008-12-12 190 views

回答

39

最簡單的方法(和Rob M將大喊大叫如何,這是錯誤的)只是就爲DLL文件標籤使用SelfRegCost=1

這是錯誤的,因爲我們應該明確控制DLL的註冊,不允許它僅僅通過DllRegisterServer運行任意代碼。理論上說,當調用DllRegisterServer時,除了在註冊表中放入適當的條目外,DLL不應該做任何事情。不幸的是,他們中的很多人做的不止於此,所以自我註冊可能是讓您的安裝工作的唯一方法。

這也是錯誤的,因爲這意味着Windows安裝系統不知道有關這些註冊表項的任何內容,以及應該在哪裏,哪些不應該在那裏。這意味着修復將不起作用,並且可能卸載不會正常清理等。

否則,您可以通過在您的DLL上指向heat.exe並將其輸出集成到當前的WiX中來生成相應的WiX代碼項目。您將獲得各種類,ProgID,TypeLib和Registry標籤。您可能需要手動編輯該輸出才能編譯它。

我希望有幫助。

+0

所以基本上覆制/粘貼heat.exe輸出,並更改相應的路徑等? – Davy8 2008-12-12 21:52:47

+0

我喜歡把加熱創建的wxs放入主wxs引用的片段中。你通過什麼選擇加熱,沒有註冊該DLL。 – CheGueVerra 2008-12-12 23:42:00

+0

我通常必須將類和progid標籤移動到文件標籤中,並可能編輯某些註冊表項。特別是,如果DLL是一個.NET DLL,則需要爲引用mscoree.dll的註冊表項提供唯一的ID,否則您將與自動生成的衝突發生衝突。 – 2008-12-13 00:24:00

23

這不僅僅是我會咆哮和狂怒SelfReg是如何邪惡的。 MSI SDK爲您提供a list of seven reasons why not to use 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> 

最後,特洛伊的答案是正確的。

13

您可以嘗試使用heat.exe程序,然後在您的wix代碼中引用片段。

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

如:

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