2008-09-23 106 views

回答

3

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

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

商业,封闭源代码,但在这里 http://www.managedxll.com/

1

功能更丰富一个你不能简单的实例化它们为COM对象,VSTO不会在默认应用程序域中运行。

以下是我如何做到的,这无疑是有点复杂的。这是将VSTO工作簿另存为XLA文件,这在某些方面比纯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()); 
    } 
} 

,需要考虑到得到一些更多的问题这个强劲的工作 - 如果你感兴趣下面了解这件事让我知道,我会发布更多的细节。

相关问题