使用 WiX 进行 x64 Word 2010 插件注册
Posted
技术标签:
【中文标题】使用 WiX 进行 x64 Word 2010 插件注册【英文标题】:x64 Word 2010 Add In registration using WiX 【发布时间】:2012-05-31 22:33:31 【问题描述】:我正在使用 WiX 部署 Word Add in,关于 x84 目标平台(至少 Office 安装必须是 x86,使用的 OS 平台越少越好)一切运行良好,我的 Word Add 的 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 部分。在此之前,我阅读了以下关于registry reflection 的文章告诉这个:
例如,32 位 InprocServer32 键与 64 位应用程序无关,因此 InprocServer32 键不会反映到 64 位注册表视图。
此外:
但是,64 位应用程序可以使用 32 位 LocalServer32 密钥,并且 LocalServer32 密钥会得到反映。
但是我已经尝试使用 LocalServer32 而不是 InprocServer32,但是这样做不会让我的插件在两个平台上都启动。
我是否必须使用对RegAsm Tool 的调用,或者我缺少某些标签或x64 平台的互操作注册选项?有人可以帮忙吗?
【问题讨论】:
【参考方案1】:使用 wix 你需要做两件事来禁用注册表反射:
-
将您的组件标记为 64 位组件(属性 Win64="yes")(就像您所做的那样)
将您的包构建为 64 位包(平台 = x64)
此软件包无法在 x86 系统上使用。因此,您将需要两个包,一个用于 x86,一个用于 x64。您可以对两个包使用相同的源文件,因为 x86 包会忽略 Win64 属性。
【讨论】:
以上是关于使用 WiX 进行 x64 Word 2010 插件注册的主要内容,如果未能解决你的问题,请参考以下文章