将VSTOfunction公开到VBA而不是本地pipe理员

将Dotnet VSTO Excel加载项中的某些function公开给VBA,而不要求用户成为本地pipe理员(即不需要COM注册, 不需要HttpListener ),最好的办法是什么? 是否可以使用VBA中的Microsoft Message Queues?

如果我可以将问题解释为“如何在没有COM注册的情况下将.Net程序集中的function展示给Excel”,那么一个优秀的解决scheme就是使用Excel的XLL界面。 基本上一个部署一个xll shim和一个相关的.net dll。 当xll被加载时,它反映了dll并将其中的函数暴露给Excel。

一个开源的实现可以在这里findhttp://exceldna.typepad.com/blog/2006/01/introducing_exc.html

一个商业,封闭的来源,但更多function丰富的一个在这里http://www.managedxll.com/

您不能简单地将它们实例化为COM对象,因为VSTO不会在默认的应用程序域中运行。

这是我做到的,这是无可厚非的。 这是一个VSTO工作簿保存为XLA文件,在某些方面比纯VSTO加载项更灵活。

  • 您需要使用regasm.exe生成一个types库,这个库将被VBA代码引用。

  • 在你的.NET对象模型中创build一个根工厂类,它能够实例化任何你想在VBA中使用的类(类似于Office对象模型中的“应用程序”类)。

  • 然后您需要find一种方法将对此工厂类实例的引用传递给VBA。 一旦VBA引用了这个工厂类的实例,它就可以调用它的方法来实例化.NET对象模型中的任何其他对象。

  • 要将实例传递给VBA,请在VBA代码中定义一个macros,如下所示

示例代码:

Private m_objMyFactory As Object Public Sub RegisterFactory(MyFactory As Object) On Error GoTo ErrHandler Set m_objMyFactory = MyFactory Exit Sub ErrHandler: MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description Exit Sub End Sub 
  • 现在将代码添加到VSTO ThisWorkbook_Open事件处理程序中,该处理程序实例化您的工厂对象,并调用上面的macros,将引用传递给工厂对象。

示例代码:

 void ThisWorkbook_Open() { try { ThisApplication.Run("RegisterFactory", new MyNamespace.MyFactory(), Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); } catch (Exception ex) { MessageBox.Show("Load error: " + ex.ToString()); } } 

还有几个问题需要考虑,以使其稳健运行 – 如果您有兴趣跟进此事,请告诉我,我将发布更多详细信息。

您可能对Excel4Net感兴趣(与ExcelDNA和ManagedXll类似,但更易于使用):

网站: http : //www.excel4net.com

博客: http : //excel4net.blogspot.com

仅供未来的读者参考:您可能还想看看这个问题:

从VBA访问VSTO应用程序插件types(Excel)

特别是在那里引用的博客:

VSTO加载项,COMAddIns和RequestComAddInAutomationService

通过重写RequestComAddInAutomationService() ,可以公开所需的任何function,方法是定义一个Facade类,为所有这些function提供入口点,然后将该类公开给VBA。