0

简短版本 我在 VB.net 和 VSTO 中有一个 Word 插件,它通过 Word.COMAddins.Object 公开一个 COM 兼容对象,因此插件功能可以在 Word 外部调用,而无需跨进程访问 Word 本身.

该技术在 VB6 中有效,但在 VB.net 中,它仍然有效,但它比通过任务窗格直接从插件运行的相同代码慢得多,就好像调用都是跨进程时它们不应该的一样。X

长版 这个插件本质上是对 Word 文档进行大量处理。该插件可以通过两种方式运行。

  1. 在 Word 中,使用任务窗格
  2. 在外部,通过一组暴露给 COM 的类(因为我必须提供对 VB6 客户端应用程序的功能的访问。

但是,这是问题所在。任何做过 Word 自动化的人都知道,使用 Word 以完全可接受的方式运行 INPROC 的代码(在这种情况下是 Word 本身加载的 ADDIN 的实例),通常会在进程外(或跨进程)慢得令人无法接受。

这个应用程序没有什么不同。

很久以前,我使用了一个方便的技巧来规避这个问题。

  1. 像往常一样创建一个 Word 插件
  2. 通过 Word.COMAddin.Object 属性公开一个对象,让外部代码访问您的插件。
  3. 在您的外部项目中,不要直接操作 Word,而是使用 Application.COMAddins 集合,找到您的插件,从中检索公开的 COMAddin.Object 属性,然后调用该对象上的方法来完成工作。

当然,对您的 COMAddin.Object 对象的调用仍然是跨进程的,但是,一旦在 Word 处理中的插件中执行,您的插件现在可以执行它想要的所有 Word 对象操作,而且速度很快,因为它们那时所有的进程内调用。

这在 VB6 COM 时代有效。

但是,我将这个 VB.net vsto 插件放在一起,并通过 VSTO 的 Connect 对象的 RequestComAddInAutomationService 函数公开我的插件对象

我可以从外部调用我的插件,它们都完全按照我的预期工作,除了它们都是 +slow+,非常像对 Word 的调用仍在跨进程执行,即使代码对 Word 进行这些调用是 Word 在进程内加载的插件 dll 的一部分!

并且慢到大约 10 到 1 倍;当通过任务窗格直接从 ADDIN 运行时需要 3 秒运行,当通过 COMADDIN.object 对象从外部代码调用时需要约 30 秒运行。

我猜我在.net APPDOMAINS 或其他什么方面遇到了某种问题,而+really+ 构成了.net 中的跨进程调用,但到目前为止我还没有发现任何关于这种事情的暗示。

除非有一些神秘的洞察力,否则我的下一步将是编写一个重现代码,由于正在播放的元素数量众多,这可能会变得很棘手。

有什么想法吗?

4

2 回答 2

1

我对我的 VSTO Word 插件进行了同样的观察。我想在此处添加:当您将过程作为单击处理程序添加到按钮时:

`this.testButton.Click += new Office._CommandBarButtonEvents_ClickEventHandler(YourProcedure);´

并在“YourProcedure”中实现昂贵的过程,您可以使用调用 Word 的 UI 线程

this.testButton.Execute();

这也不是一个优雅的解决方案,但如果您碰巧在 CommandBar 中准备好按钮,它可能会很有用。

于 2011-04-27T19:24:14.227 回答
0

不幸的是,Thorben 提到的事件挂钩技术不适用于我的特定情况。

所以我用我在评论中提到的解决方法来结束这个问题,我会在这里重复......

好吧,这不是一个完美的解决方案,但我找到了 +a+ 解决方案。它涉及一个计时器,所以它绝对不是最佳的本质上,当 Word 加载插件时(即在 STARTUP 事件期间),初始化一个计时器(一个 WINFORMS 计时器,而不是线程计时器),并将其间隔设置为 500。当外部代码通过 COMADDIN.OBject 属性连接到插件,并调用插件,设置变量标志,定时器正在轮询该标志。当计时器看到它设置时,它会重置标志并执行操作。

这不是我想要的干净的解决方案,但它很容易实现,事后也很容易理解,而且它绝对避免了 xprocess COM 调用 Word 的速度变慢。

于 2012-07-03T15:28:30.757 回答