2012-01-17 285 views
1

我正在使用從Excel中的VBA調用的COM可見C#庫。被調用的C#方法包含由ref傳遞的參數。我使用VS2010,Office 2010的.NET框架4VBA/C#COM互操作 - 錯誤430

  • 在我的Excel文件的早期版本,在調用庫工作正常,仍然如此。在新版本(C#庫調用本身沒有改變)中,VBA設法調用庫,但是當C#方法完成時,我得到一個運行時錯誤430「類不支持自動化或者不支持預期的接口「。我使用DEBUG模式來查看。在同一個文件中,VBA設法調用已部署的.NET庫。

我的嘗試: - 重新添加參考VBA OLE自動化庫。 - 重新編譯C#庫

我對有什麼可能是錯誤的以及在哪裏有點困惑。 Excel本身似乎不是問題,因爲我的舊文件起作用。 C#庫也從我的舊文件中調用,所以問題不應該來自庫。至於我的文件調用COM可見庫的能力,那麼對另一個C#庫的調用就可以工作(部署這個庫)。

任何幫助將不勝感激!


的VBA調用CSHARP如下:

Dim csharptoolsDispatch As Object 
Set csharptoolsDispatch = CreateObject("Dispatch.Caller") 
Dim a as string 
ReDim input(0 to 5) as single 
ReDim output(0 to 5) as single 
a = csharptoolsDispatch.solveDispatch(2, False, input, output) 

C#的樣子:

-Interface

namespace Dispatch 
{ 
    public interface iCaller 
    { 
     string solveDispatch(int a, bool flag, float[] input, ref float[] output); 
    } 
} 

-Class

namespace Dispatch 
{ 
    [ClassInterface(ClassInterfaceType.None)] 
    [ComVisible(true)] 
    public class Caller : iCaller 
    { 
     public string solveDispatch(int a, bool flag, float[] input, ref float[] output) 
     {  
      //code 
      return "ok"; 
     } 
    } 
} 

對Csharp方法的調用工作正常,Csharp運行正常,並在'返回'ok''後,當「焦點」返回到VBA時,出現錯誤430消息。

+0

你能發佈實際的產品線嗎?該錯誤消息是說你正在嘗試做一些事情,C#interop或Excel不支持你要求它做的事情。由於它適用於該文件的較舊版本,因此您可能會要求Excel 2010使用2003 snytax做某些事情。看到一些代碼應該讓我們確定是什麼。 – Pynner 2012-01-17 17:48:53

+0

剛發佈了一些代碼。這兩個excel文件都是excel 2010文件。 – user1153715 2012-01-18 10:21:43

回答

2

好吧,我設法整理出來。

事後看來,這是一個非常明顯的錯誤,但是來自VBA和C#之間的COM interop接口的奇怪行爲使得難以發現。

在對C#的VBA調用中,參數之間有一個單一的表,它被定義爲C#中的一個int表。該論點在參考文獻中傳遞。

在這種情況下,我希望VBA崩潰說'無效論點'或什麼的。相反,似乎有一個int的隱式轉換,它可以調用C#。 然後,當csharp方法完成時,VBA似乎無法理解它在ref中傳遞的參數以及該更改的類型。這會導致430錯誤。

我的早期版本沒有這個錯誤,因此工作。

我必須remenber VBA是非常弱鍵入!

無論如何,神祕解決了!