MS Office Word VSTO“按需加载”

时间:2015-09-17 14:34:51

标签: ms-word vsto ms-office word-addins

我们开发了一种标准VSTO插件产品(Word 2010和Word 2013,仅限x86)。默认情况下,在安装它时,会为所有用户安装它(即,将插件注册表项插入HKLM - HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\Office\Word\Addins)。

LoadBehavior reg键的值设置为0x3(即“启动时加载”)时,插件工作正常,但是当我们设置LoadBehavior的值时到0x10(即“按需加载”),插件无法正常工作:

由于UAC(以及Word未升级),HKLM中LoadBehavior的值不会从0x10更改为0x9,而是通过创建{{{}来覆盖HKCU配置单元中的1}}键(值为LoadBehavior)。

不幸的是,我们发现HKCU覆盖的价值没有考虑,除非HKCU配置单元中存在Manifest密钥以及0x9。有关此相关主题的更多信息:https://social.msdn.microsoft.com/Forums/vstudio/en-US/3776734b-333e-423b-9c08-7c7a441c3e94/load-behavior-and-word-addin?forum=vsto

此问题的“明显”补救措施是在每个用户运行插件时,在安装时 OR 为每个用户(以及HKLM)将LoadBehavior写入HKCU第一次。然而,这种方法有一些严重的缺点:

  • 卸载插件需要删除每个用户的HKCU值,以防止用户遇到加载问题(建议不要这样做,并引发其他问题/复杂情况,例如需要使用Active Setup - Remove registry keys under HKCU on a per machine installation)。
  • 在(漫游)HKCU配置单元中具有这些值的用户在登录到未安装插件的同一域中的计算机时会遇到问题。

是不是从HKLM 获取清单的错误,其中Manifest在HKCU中设置得恰当?我认为,如果HKLM中的LoadBehavior可以在HKCU中被覆盖而不需要覆盖LoadBehavior值,那么这个问题就会得到解决。

任何人都知道如何克服这个问题?

2 个答案:

答案 0 :(得分:1)

没有将UAC设置为"从不通知,"我不知道如何直接克服你的问题。但是,我将建议一种解决方法,使您基本上可以按需加载

我建议您将VSTO插件LoadBehavior更改为0x0(已卸载 - 不自动加载),然后在自动加载的模板中使用VBA命令来控制添加时间 - 负载。以下是要采取的步骤概述:

  1. 在Visual Studio中,确保插件中的功能区编码为XML文件(不是使用可视设计器创建的)。在此功能区中定义自定义命名空间。
  2. 创建Word模板(.dotm)。使用此模板中的Custom UI Editor for Microsoft Office嵌入功能区选项卡的XML,该选项卡的标签和位置与加载项中的相同。在XML中定义与Visual Studio XML代码中的命名空间相同的命名空间,以便它们共享相同的命名空间。另外,定义一个可以加载插件的按钮(也可以在插件中执行其他功能)。
  3. 在你的模板中写一个sub来使用这段代码加载你的卸载的0x0插件:

    Application.COMAddIns(ProgID).Connect = True

    ProgID可以是ProgID的项目idex,也可以是引号中ProgID的实际名称。

  4. 在你的模板中写一个回调,它将调用代码从按钮加载插件。

  5. 将模板放在Word的STARTUP目录中。对于Word 2010,C:\Program Files (x86)\Microsoft Office\Office14\STARTUP

  6. 我们想要发生的是,当Word启动时,VSTO插件已安装但未加载。您创建的模板将自动从STARTUP目录加载,并将应用程序的功能区选项卡放在Word中。由于未加载VSTO插件,因此这些控件当前不可见。但是,在执行上述步骤后,当单击模板XML中的按钮时,您的插件会将其控件加载到同一个功能区上,因为它们共享一个命名空间。当Word关闭并重新启动时,它将重置为正在安装但尚未加载的VSTO插件。

    更进一步,如果你想避免额外点击加载VSTO插件控件,你可以想象在模板中重新创建VSTO插件的XML并让每个控制调用代码加载你的VSTO插件,隐藏模板的功能区控件,并执行插件的功能。通过这种方式,您可以使用模板的XML提供占位符功能区,并根据需要加载和执行操作。

答案 1 :(得分:0)

您使用按需加载的原因很可能是提高启动性能,如MSDN中所述。但是,按需加载会带来一系列问题(不支持动态功能区UI状态,HKLM部署问题等)。

正如您已经说过的,启动时加载没有问题。因此,加载加载项的推荐方法是使用LoadBehavior 0x3的值。

如果您遇到加载项加载性能问题,一种解决方案可能是使用轻量级加载项,该加载项始终在启动时加载,然后此加载项充当实际添加的加载器 - 在。

相关问题