使用COM互操作从VBA代码调用C#方法时参数有哪些限制?
我发现如果我调用一个采用单个简单类型(string,int等)的方法就可以了,但调用一个将自定义类作为参数的方法失败 - 出现“类型不匹配”错误在编译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 :(得分: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