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中的某个地方。我没有主意了。也许你是对的。。非常感谢你的努力,我要给你一张赞成票