3

我使用 WiX 部署 Word 插件,关于 x84 目标平台(至少 Office 安装必须是 x86,使用的操作系统平台越少)一切运行良好,我的 Word 插件的 COM 互操作注册工作和在我安装插件后第一次启动 word 时插件会自动启动。

我正在对注册表进行以下注册(从 heat.exe 的输出中删除)

我创建了一个中间文件,帮助我使用以下 heat 命令进行 COM 互操作注册:

"C:\Program Files\Windows Installer XML v3.5\bin\heat.exe" file MyAddin.dll -ag -template fragment -out MyAddin.wxs 

感兴趣的输出看起来像:(我知道以这种方式使用 RegistryValue 已被弃用)

<Class Id="{10BC65F1-32C0-3ED4-98A0-17661A8C4455}" Context="InprocServer32" Description="MyAddin.MyAddinClass" ThreadingModel="both" ForeignServer="mscoree.dll">
    <ProgId Id="MyAddin.MyAddinClass" Description="MyAddin.MyAddinClass" />
</Class>
<File Id="filCC4172BEC1312562EDEF49648E45AE0D" KeyPath="yes" Source="..\MyAddin\bin\Debug\MyAddin.dll" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" Value="" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32\1.0.0.0" Name="Class" Value="MyAddin.MyAddinClass" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32\1.0.0.0" Name="Assembly" Value="MyAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32\1.0.0.0" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32\1.0.0.0" Name="CodeBase" Value="file:///[#filCC4172BEC1312562EDEF49648E45AE0D]" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32" Name="Class" Value="MyAddin.MyAddinClass" Type="string"Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32" Name="Assembly" Value="MyAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32" Name="RuntimeVersion" Value="v4.0.30319" Type="string" Action="write" />
<RegistryValue Root="HKCR" Key="CLSID\{10BC65F1-32C0-3ED4-98A0-17661A8C4455}\InprocServer32" Name="CodeBase" Value="file:///[#filCC4172BEC1312562EDEF49648E45AE0D]" Type="string" Action="write" />

包含这些内容的组件将 Win64Flag 标记设置为 yes。因此,我认为会将内容写入注册表的 x64 部分。在此之前,我阅读了以下有关注册表反射的文章,告诉您:

例如,32 位 InprocServer32 键与 64 位应用程序无关,因此 InprocServer32 键不会反映到 64 位注册表视图。

此外:

但是,64 位应用程序可以使用 32 位 LocalServer32 密钥,并且 LocalServer32 密钥会得到反映。

但是我已经尝试使用 LocalServer32 而不是 InprocServer32,但是这样做不会让我的插件在两个平台上都启动。

我是否必须调用RegAsm 工具,或者我缺少 x64 平台的某个标签或互操作注册选项?有人可以帮忙吗?

4

1 回答 1

0

使用 wix 您需要做两件事来禁用注册表反射:

  1. 将您的组件标记为 64 位组件(属性 Win64="yes")(就像您所做的那样)
  2. 将您的包构建为 64 位包(平台 = x64)

这个包不能在 x86 系统上使用。因此,您将需要两个包,一个用于 x86,一个用于 x64。您可以对这两个包使用相同的源文件,因为 x86 包会忽略 Win64 属性。

于 2013-05-24T16:55:28.770 回答