我已使用 WiX 创建了 MSI。我正在尝试在 x64 Windows Vista 上注册 .NET 组件以实现 COM 互操作。但是,在运行 MSI 安装并启动使用这些组件的网站后,我看到以下错误消息:
Component Execution failed for component[0xC] hr: 0x0 CLSID: {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774} Could not create Component . This may be a component registration issue.
这似乎不是由常见问题引起的,经过大量尝试后,我发现可以通过执行以下操作来解决此问题:
- 导出 CLSID\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774} 注册表项。
- 删除 CLSID\{3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774} 的项和所有子项
- 重新导入第 1 步导出的 .reg。
完成这 3 个步骤后,组件已正确解析,Web 应用程序工作正常。
更新:我刚刚在安装程序运行后以及执行上述 3 个步骤后导出了整个 HKCR 注册表项。对两个文件进行比较没有发现任何差异!
所以我的问题是,我需要对 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" />
最佳答案
答案(对我来说)是注册表权限!
睡了一夜好觉后,我意识到,如果注册表项导出没有差异,那么答案一定存在于未导出的注册表差异中。当然,其中一种可能性(可能是唯一的一种?)是注册表权限。
有了更好的谷歌搜索术语,我找到了线程 Heat and COM registry permissions 。该线程解释了如果您没有 WiX 属性 ALLUSERS
设置值为 1
(即 <Property Id="ALLUSERS" Value="1" />
),那么默认情况下您的安装程序将运行并在每个用户配置单元中安装注册表项。因此,为什么我的网络应用程序看不到它们(因为它以不同的用户身份运行)并且无法创建它们。
我的故事的寓意是:您不能指望 Heat.exe 完成所有工作。您不能只涉足 WiX 和 MSI。
我希望某个地方有一个简洁的 WiX 安装程序项目 list ...
关于com - WiX COM 注册失败,但导出注册表项、删除并重新导入有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9232777/