COMException:尝试访问COM方法时类型不匹配

问题描述 投票:0回答:3

我试图通过使用类似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

您知道是什么原因造成的,我应该如何解决?

c# .net com vb6 interop
3个回答
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);
}

0
投票

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

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

使用命令行参数进入tlbimp以确保您具有一致的Interop,而不是在您选择向Com Component添加引用时生成的默认Interop。


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);

对我来说这是其他解决方案的重新运行类型不匹配错误。

© www.soinside.com 2019 - 2024. All rights reserved.