2010-01-07 77 views
3

使用COM互操作從VBA代碼調用C#方法時,參數的限制是什麼?類型不匹配錯誤使用COM互操作從VBA調用C#dll

我發現如果我調用一個只需要一個簡單類型(string,int等)的方法,但它調用一個將自定義類作爲參數的方法失敗 - 使用'Type Mismatch'編譯VBA代碼時出錯。

C#代碼:

public namespace foo { 
    public class XXX { } 

    public class Service { 
     public setString(String val) { ... } 
     public setXXX(XXX val) { ... } 
    } 
} 

VBA代碼:

Dim service As New foo.Service 
service.setString("this works") 

Dim complexClass as New foo.XXX 

Rem This fails with a type mismatch error 
service.setXXX(complexClass) 

如上所述,所述VBA編譯扼流圈在這條線:service.setXXX(complexClass)

任何想法?

+0

對不起,不發佈一個答案。相反,我有一個建議:如果你要做任何大量的COM-interop(使用r.NET消耗COM對象,或COM對象通過COM-Callable-Wrapper訪問.NET對象,請自行購買本書:http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X如果它不在那本書中,你不需要知道它 – Yoopergeek 2010-01-07 19:41:15

+0

XXX是否實現了任何接口? – 2010-01-07 20:39:04

回答

1

您的示例代碼中setString和setXXX的方法簽名不完整,因爲它沒有聲明它是否返回void或任何其他數據類型。 如果的setXXX返回void,嘗試圍繞VBA的方法調用它的參數(一個或多個)去除括號,如:

service.setXXX complexClass 

說明:

在VBA中,你不應該括子rotine的論據括號內。這可以很容易地驗證創建一個具有兩個參數的子程序,並試圖將其稱爲包裝圓括號中的參數:

//C# 
public void setXXX2(XXX val, XXX val2) { } 

'VB 
service.setXXX2 (complexClass, complexClass) 'Error 

回到您的例子,當你裹着你的括號內一個參數,您創建了一個Parenthesized Expression,將計算得到一個簡單的數據值 - 在這種情況下,String類型。

你可以看到你自己添加新的方法 - 我把它叫做GetParameterType - 你的類用於測試目的:

public class Service { 
    public void setString(String val) { } 
    public void setXXX(XXX val) { } 
    public void setXXX2(XXX val, XXX val2) { } 

    public string GetParameterType(object val) { 
     return val.GetType().Name; 
    } 
} 

然後運行該方法直接傳遞變量,然後變量括號中。

MsgBox service.GetParameterType(complexClass) ' Returns XXX 
MsgBox service.GetParameterType((complexClass)) ' Returns String 
+0

+1 ,在方法參數中添加paranthesis是不正確的,它甚至可以將方法調用的語義從ByRef更改爲ByVal調用:http://stackoverflow.com/questions/1070863/hidden-features-of-vba/1070942# 1070942 – 2010-01-07 23:13:31

+0

感謝這真的很有幫助。但是,一個問題是,如果我從VB代碼中傳遞一個數組,它的實現GetParameterType似乎不起作用,它與COR_E_SAFEARRAYTYPEMISMATCH一起失敗。我試圖創建一個類似的方法來獲取object [],因爲它是參數的結果相同houghts? – matt 2010-01-08 03:40:05