COMException:尝试访问COM方法时键入不匹配

时间:2010-08-18 06:06:56

标签: c# .net com vb6 interop

我尝试使用像obj.Do("text")这样的代码来访问COM方法,而Do是obj中的一个方法,它以ref string作为输入(obj是.COM对象,用VB6编写)。但是它总是抛出COMException类型不匹配。我尝试传递obj.Do(ref a),而a是一个字符串变量,但它也不起作用。

VB代码看起来像这样

Function Generate(sDestinationFile As String)
    ....
Exit Function

你知道是什么原因引起的吗?我应该怎样解决这个问题?

3 个答案:

答案 0 :(得分:1)

VB6 cls是什么样的?

例如,像这样的东西似乎可以作为快速测试。

VB6 cls名为stringMe.cls:

Dim someString As String

Function AddString(ByRef someString)
    AddString = "Hello " & someString
End Function

我将其编译为ActiveX DLL。

在C#中,我添加了对DLL的引用并编码:

static void Main(string[] args)
{
    StringMe sm = new StringMe();
    object inVar = "world!";
    string returnVar = sm.AddString(ref inVar).ToString();
    System.Console.WriteLine(returnVar);
}

答案 1 :(得分:0)

使用VB6组件,请确保您有一个二进制兼容性引用DLL,以便在每次编译时它为dll生成相同的DispID,否则.Net项目的Interop将不会引用正确的方法

请记住,在添加方法等后重新编译VB6组件时,需要为.Net项目生成一个新的Interop。

将命令行参数用于tlbimp以确保您具有一致的Interop,而不是在选择Add Com to Com Component时生成的默认Interop。

答案 2 :(得分:0)

要从.net调用vb6组件,您必须这样做

var array = new string[20];
var x = new System.Runtime.InteropServices.VariantWrapper(array as object);
var x2 = x as object;
comComponent.callFunction(ref x2);

这对我有用,其他解决方案是重新运行类型不匹配错误。