【发布时间】:2010-12-01 05:54:13
【问题描述】:
我们有一个用于 Excel 的 VSTO 应用程序插件(不是文档插件),我们希望向 VBA 代码公开一个事件,以便 VBA 宏可以在插件中触发此事件时执行一些操作。如何让 VBA 代码能够订阅 VSTO 应用程序插件中定义的事件?
我认为既然插件是在 Excel 进程中加载的,这应该不会太棘手,但还没有找到方法。
顺便说一句,使用 VS 2008 和 Excel 2007。
谢谢!
【问题讨论】:
我们有一个用于 Excel 的 VSTO 应用程序插件(不是文档插件),我们希望向 VBA 代码公开一个事件,以便 VBA 宏可以在插件中触发此事件时执行一些操作。如何让 VBA 代码能够订阅 VSTO 应用程序插件中定义的事件?
我认为既然插件是在 Excel 进程中加载的,这应该不会太棘手,但还没有找到方法。
顺便说一句,使用 VS 2008 和 Excel 2007。
谢谢!
【问题讨论】:
VSTO 不是通常可以从其他 DLL 调用的 DLL。 VSTO 基本上是暴露于 COM 的 .NET 代码,在包装器中运行,而包装器在单独的 AppDomain 中运行。尽管您的 VSTO 加载项在技术上是一个加载到 Excel 中的 DLL,但它的运行方式更像是一个顶级 EXE,而不是作为向其他调用者公开的 DLL 库。
就我个人而言,我会创建一个标准的 .NET 程序集——也就是说,避免为此使用 VSTO——并使用正确的属性将它公开给 COM。这个过程在这里得到了很好的解释:COM Interop Exposed - Part 2,在标题为“向 COM 公开 .NET 事件”的部分下。
如果你真的坚持让 VBA 能够调用 VSTO,那么你必须通过覆盖 RequestComAddInAutomationService 方法启用的 Office.COMAddIn.Object 属性进行操作。该过程在 Andrew Whitechapel 的文章VSTO Add-ins, COMAddIns and RequestComAddInAutomationService 中有详细讨论。
我希望这会有所帮助!
迈克
【讨论】: