简短版本 我在 VB.net 和 VSTO 中有一个 Word 插件,它通过 Word.COMAddins.Object 公开一个 COM 兼容对象,因此插件功能可以在 Word 外部调用,而无需跨进程访问 Word 本身.
该技术在 VB6 中有效,但在 VB.net 中,它仍然有效,但它比通过任务窗格直接从插件运行的相同代码慢得多,就好像调用都是跨进程时它们不应该的一样。X
长版 这个插件本质上是对 Word 文档进行大量处理。该插件可以通过两种方式运行。
- 在 Word 中,使用任务窗格
- 在外部,通过一组暴露给 COM 的类(因为我必须提供对 VB6 客户端应用程序的功能的访问。
但是,这是问题所在。任何做过 Word 自动化的人都知道,使用 Word 以完全可接受的方式运行 INPROC 的代码(在这种情况下是 Word 本身加载的 ADDIN 的实例),通常会在进程外(或跨进程)慢得令人无法接受。
这个应用程序没有什么不同。
很久以前,我使用了一个方便的技巧来规避这个问题。
- 像往常一样创建一个 Word 插件
- 通过 Word.COMAddin.Object 属性公开一个对象,让外部代码访问您的插件。
- 在您的外部项目中,不要直接操作 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 中的跨进程调用,但到目前为止我还没有发现任何关于这种事情的暗示。
除非有一些神秘的洞察力,否则我的下一步将是编写一个重现代码,由于正在播放的元素数量众多,这可能会变得很棘手。
有什么想法吗?