2008-09-23 83 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()); 
    } 
} 

,需要考慮到得到一些更多的問題這個強勁的工作 - 如果你感興趣下面瞭解這件事讓我知道,我會發布更多的細節。

相關問題