类型不匹配错误使用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)
任何想法?
您的示例代码中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
+1 ,在方法参数中添加paranthesis是不正确的,它甚至可以将方法调用的语义从ByRef更改为ByVal调用:http://*.com/questions/1070863/hidden-features-of-vba/1070942# 1070942 – 2010-01-07 23:13:31
感谢这真的很有帮助。但是,一个问题是,如果我从VB代码中传递一个数组,它的实现GetParameterType似乎不起作用,它与COR_E_SAFEARRAYTYPEMISMATCH一起失败。我试图创建一个类似的方法来获取object [],因为它是参数的结果相同houghts? – matt 2010-01-08 03:40:05
对不起,不发布一个答案。相反,我有一个建议:如果你要做任何大量的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
XXX是否实现了任何接口? – 2010-01-07 20:39:04