类型不匹配错误使用COM互操作从VBA调用C#dll

问题描述:

使用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

您的示例代码中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://*.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