2

将 Dotnet VSTO Excel 加载项中的某些功能公开到 VBA 的最佳方式是什么,而不要求用户是本地管理员(即没有 COM 注册,没有 HttpListener)?是否可以使用 VBA 中的 Microsoft 消息队列?

4

4 回答 4

3

如果我可以将您的问题解释为“如何在没有 COM 注册的情况下将 .Net 程序集中的功能公开给 Excel”,那么一个很好的解决方案是使用 Excel 的 XLL 接口。基本上一个部署一个 xll shim 和一个关联的 .Net dll。当加载 xll 时,它反映在 dll 上并将其中的函数公开给 Excel。

可以在此处找到开源实现http://exceldna.typepad.com/blog/2006/01/introducing_exc.html

一个商业的、封闭的源代码,但功能更丰富的一个在这里 http://www.managedxll.com/

于 2008-09-23T13:06:30.903 回答
1

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

这就是我的做法,诚然,这有点令人费解。这是使用另存为 XLA 文件的 VSTO 工作簿,它在某些方面比纯 VSTO 加载项更灵活。

  • 您需要使用 regasm.exe 生成一个类型库,您的 VBA 代码将引用该类型库。

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

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

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

示例代码:

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 事件处理程序,该处理程序实例化您的工厂对象并调用上述宏,传递对工厂对象的引用。

示例代码:

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());
     }
}

要使这项工作稳健地运行,还有一些问题需要考虑 - 如果您有兴趣跟进,请告诉我,我会发布更多详细信息。

于 2008-09-23T13:20:34.740 回答
1

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

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

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

于 2009-01-04T12:13:56.183 回答
0

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

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

尤其是那里引用的博客:

VSTO 加载项、COMAddIns 和 RequestComAddInAutomationService

通过重写RequestComAddInAutomationService(),您可以通过定义为所有这些功能提供入口点的 Facade 类并将该类公开给 VBA 来公开您想要的任何功能。

于 2010-08-16T15:40:12.167 回答