我使用WiX创建了一个MSI。我正在尝试在x64 Windows Vista上为COM interop注册.NET组件。但是,在运行MSI安装然后启动使用这些组件的网站后,我看到以下错误消息:
组件[0xC]的组件执行失败hr:0x0 CLSID: {3C1CEEC0-3B20-46F8-8D4E-5F16E93D8774}无法创建组件。 这可能是组件注册问题。
这似乎不是由通常的问题造成的,经过大量的游戏后,我发现我可以通过以下方式解决此问题:
完成这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" />
答案 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安装程序项目清单...