繁体   English   中英

键入Mismatch错误使用com interop从VBA调用C#dll

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM