[英]Type Mismatch error calling C# dll from VBA using com interop
使用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)
有什么想法吗?
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
回到您的示例,当您将单个参数包装在括号内时,您创建了一个括号表达式 ,该表达式计算为一个简单的数据值 - 在本例中为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.