Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# COMException:尝试访问COM方法时类型不匹配_C#_.net_Com_Vb6_Interop - Fatal编程技术网

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

C# COMException:尝试访问COM方法时类型不匹配,c#,.net,com,vb6,interop,C#,.net,Com,Vb6,Interop,我尝试使用类似于obj.Do(“text”)的代码访问COM方法,而Do是obj中的一种方法,它将ref字符串作为输入(obj是一个.COM对象,用VB6编写)。但是,它总是抛出COMException类型不匹配。当a是字符串变量时,我尝试传递obj.Do(refa),但也不起作用 VB代码如下所示 Function Generate(sDestinationFile As String) .... Exit Function var array = new string[20]; v

我尝试使用类似于
obj.Do(“text”)
的代码访问COM方法,而
Do
是obj中的一种方法,它将
ref字符串
作为输入(obj是一个.COM对象,用VB6编写)。但是,它总是抛出COMException类型不匹配。当a是字符串变量时,我尝试传递
obj.Do(refa)
,但也不起作用

VB代码如下所示

Function Generate(sDestinationFile As String)
    ....
Exit Function
var array = new string[20];
var x = new System.Runtime.InteropServices.VariantWrapper(array as object);
var x2 = x as object;
comComponent.callFunction(ref x2);

您知道这是什么原因吗?我应该如何解决它?

VB6 cls看起来像什么

例如,类似这样的东西似乎可以作为一种快速测试

名为stringMe.cls的VB6 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);
}

对于VB6组件,请确保您有一个放在一边的二进制兼容引用DLL,以便在每次编译时为DLL生成相同的DispID,否则.Net项目的互操作将不会引用正确的方法

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


在tlbimp中使用命令行参数,以确保具有一致的互操作,而不是选择添加对Com组件的引用时生成的默认互操作。

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

Function Generate(sDestinationFile As String)
    ....
Exit Function
var array = new string[20];
var x = new System.Runtime.InteropServices.VariantWrapper(array as object);
var x2 = x as object;
comComponent.callFunction(ref x2);

这对我来说是另一个解决方案retrun类型不匹配错误。

该错误是否与“obj”有关,而不是与字符串参数有关?或者可能参数被识别,调用被成功封送,但vb6代码中出现异常?@Louis,我尝试了几种组合,包括是否传递byref,在vb6代码中使用不同的函数签名,等等。。每个人都按预期工作,我不能重现你的错误。我倾向于@MarkJ所说的,例外是VB6中的某个地方。我没有主意了。也许你是对的。。非常感谢你的努力,我要给你一张赞成票