WiX COM注册失败,但导出reg密钥,删除和重新导入工作

时间:2012-02-10 18:22:54

标签: com wix windows-installer 64-bit com-interop

我使用WiX创建了一个MSI。我正在尝试在x64 Windows Vista上为COM interop注册.NET组件。但是,在运行MSI安装然后启动使用这些组件的网站后,我看到以下错误消息:

  

组件[0xC]的组件执行失败hr:0x0 CLSID:   {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}无法创建组件。   这可能是组件注册问题。

这似乎不是由通常的问题造成的,经过大量的游戏后,我发现我可以通过以下方式解决此问题:

  1. 导出CLSID \ {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}注册表项。
  2. 删除CLSID \ {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}的密钥和所有子密钥
  3. 从步骤1重新导入导出的.reg。
  4. 完成这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 个答案:

答案 0 :(得分:1)

答案(对我来说)是注册表权限!

经过一夜好眠,我意识到如果注册表项 exports 没有区别,那么答案必须在于未导出的注册表差异。当然,其中一种可能性(可能是唯一的?)是注册表权限。

有了更好的Google搜索条款,我找到了帖子Heat and COM registry permissions。该主题解释说,如果您没有设置值为ALLUSERS的WiX Property 1(即<Property Id="ALLUSERS" Value="1" />),则默认情况下您的安装程序将运行并在< em>每用户配置单元。因此,为什么我的Web应用程序无法看到它们(因为它以不同的用户身份运行)并且无法创建它们。

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

我希望某处有一个简洁的WiX安装程序项目清单...