2012-02-10 169 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安装程序项目清单的地方...