2012-02-10 172 views
4

我已經使用WiX創建了一個MSI。我正在嘗試在x64 Windows Vista上註冊用於COM互操作的.NET組件。然而,運行MSI安裝,然後發射了使用這些組件的網站後,我看到此錯誤消息:WiX COM註冊失敗,但註冊表項導出,刪除和重新導入工作

組件執行失敗,組件[位於0xC]小時:爲0x0 CLSID: {3C1CEEC0-3B20-46F8 -8D4E-5F16E93D8774}無法創建組件。 這可能是一個組件註冊問題。

  1. 導出CLSID \ {3C1CEEC0:

這似乎並沒有被通常的問題和大量的玩耍後引起的,我發現我可以通過以下操作解決此問題-3B20-46F8-8D4E-5F16E93D8774}註冊表項。

  • 刪除鍵和CLSID \的所有子項{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}
  • 重新導入從步驟1
  • 所述導出的.reg完成這些3個步驟後,將組件已正確解析並且Web應用程序正常工作。

    更新:我剛剛在安裝程序運行後導出整個HKCR註冊表項,然後執行上述3個步驟。對兩個文件做差異顯示沒有區別!

    所以我的問題是,我需要做什麼,我的WiX安裝程序才能得到這個工作?我認爲我做錯了什麼,但是什麼?

    僅供參考 - 我使用下面的WiX XML來創建註冊表項(我已經嘗試使用WiX Class元素,但這也不起作用)。注意:var.CLSID是一個帶有HKCR \ CLSID(不是Wow6432Node)的變量。

    <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}" Value="Awesome.Component" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Value="mscoree.dll" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="ThreadingModel" Value="Both" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\ProgId" Value="Awesome.Component" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="Class" Value="Awesome.Component" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="Assembly" Value="AwesomeAssembly, Version=0.9.2.0, Culture=neutral, PublicKeyToken=8a030859d27c8274" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="RuntimeVersion" Value="v2.0.50727" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32\0.9.2.0" Name="CodeBase" Value="file:///[#fil7B6E8E93E37519B6844149C87BAD9C0B]" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="Class" Value="Awesome.Component" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="Assembly" Value="AwesomeAssembly, Version=0.9.2.0, Culture=neutral, PublicKeyToken=8a030859d27c8274" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="RuntimeVersion" Value="v2.0.50727" Type="string" Action="write" /> 
        <RegistryValue Root="HKCR" Key="$(var.CLSID)\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}\InprocServer32" Name="CodeBase" Value="file:///[#fil7B6E8E93E37519B6844149C87BAD9C0B]" Type="string" Action="write" /> 
    

    回答

    1

    答案(對我而言)是註冊表權限!

    經過一個良好的睡眠,我意識到,如果註冊表項出口沒有差異,答案必須位於註冊表差異不會得到出口。當然,其中一種可能性(可能是唯一的可能性)是註冊表權限。

    用更好的谷歌條款武裝起來,我發現線程Heat and COM registry permissions。此線程說明如果您沒有設置值爲1(即<Property Id="ALLUSERS" Value="1" />)的WiX屬性ALLUSERS,則默認情況下,您的安裝程序將運行並在每個用戶配置單元的中安裝註冊表項。因此,爲什麼我的Web應用程序無法看到它們(因爲它以不同的用戶身份運行)並且無法創建它們。

    我的故事的道德:你不能指望Heat.exe做所有的工作。你不能只涉足WiX和MSI。

    我希望有一個簡潔的WiX安裝程序項目清單的地方...