2015-09-17 80 views
17

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

当为LoadBehavior REG键的值设置为0x3(即“在启动时加载”),该插件工作完全正常,但是当我们设置为LoadBehavior0x10的值(即“按需加载”),该插件无法正常工作,因为我们所期望的:

由于UAC(这词不运行升高),在HKLM LoadBehavior不是从0x100x9改变,而是通过创建LoadBehavior键替换的值(价值0x9)在HKCU配置单元中。

不幸的是,我们发现,除非清单项存在与LoadBehavior)沿HKCU蜂巢该HKCU重写值不考虑https://social.msdn.microsoft.com/Forums/vstudio/en-US/3776734b-333e-423b-9c08-7c7a441c3e94/load-behavior-and-word-addin?forum=vsto

此问题的“明显的”补救办法是写Manifest到HKCU为每个用户(以及在HKLM)在安装时OR当每个用户运行该插件的:对本次关联线程更多信息第一次。然而,有一些严重的缺点,使用这种方法:

  • 卸载的插件,就必须消除所有用户HKCU值,以防止用户遇到加载问题(不建议这样做,并造成其他问题/并发症,如需要使用智能安装程序 - Remove registry keys under HKCU on a per machine installation)。
  • 在其漫游HKCU配置单元中具有这些值的用户在登录到未安装我们的插件的同一域中的计算机时遇到问题。

难道不是从HKLM其中LoadBehavior适当地设定在HKCU获得清单中的错误?我认为如果HKLU中的LoadBehavior可以在HKCU中被覆盖而不需要Manifest值也被覆盖,那么这个问题就可以解决。

任何人都知道一种方法来克服这个问题?

回答

0

您使用按需加载原因最有可能是在MSDN描述提高启动性能。但是,按需加载会带来一整套问题(不支持动态功能区UI状态,HKLM部署问题等)。

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

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

+0

感谢@dirk-vollmar。只是澄清一下,想要使用'LoadOnDemand'的主要原因不是因为我们的插件很慢,而是因为我们有很多很多的插件都是关键业务的。这些资源竞争资源,如果同时加载,通常会发生“冲突”和错误。唉,我们必须生活在一个我们无法改变其他人的加载项的世界中,而当我们的客户和大部分客户一样多时,你不能要求他们全部来提高他们的负载。 – RoKa

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. 在你的模板写一个子使用此代码加载卸载插件0x0

    Application.COMAddIns(ProgID).Connect = True

    ProgID或者是你的进程id的项目IDEX或进程id的报价实际名称。

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

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

我们希望发生的是,当Word启动的VSTO外接程序已经安装,但没有加载。您创建的模板将从STARTUP目录自动加载,并将应用程序的功能区选项卡放入Word中。由于VSTO插件未加载,这些控件当前不可见。但是,在实现上述步骤之后,当点击模板XML中的按钮时,您的插件会将其控件加载到同一个功能区,因为它们共享一个名称空间。当Word关闭并重新启动时,它将重置为正在安装但未加载的VSTO插件。如果您想避免额外点击加载VSTO插件控件,您可以想象在模板中重新创建VSTO插件的XML,并让每个控件调用代码来加载您的VSTO插件,隐藏模板的功能区控件,并执行您的插件的功能。通过这种方式,您可以使用由模板的XML提供的占位符功能区以及实际的插件加载和按需执行操作。