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

时间:2010-01-07 19:32:00

标签: c# .net ms-access vba 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)

有什么想法吗?

1 个答案:

答案 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