【问题标题】:COMException: Type mismatch when trying to access a COM methodCOMException:尝试访问 COM 方法时类型不匹配
【发布时间】:2011-03-31 09:03:35
【问题描述】:

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

VB 代码如下所示

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

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

【问题讨论】:

  • 错误可能与'obj'有关,而不是字符串参数?或者可能参数被识别并且调用被成功编组,但随后在 vb6 代码中发生异常?

标签: c# .net com vb6 interop


【解决方案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);
}

【讨论】:

  • @Louis,我尝试了几种传递 byref 或不传递的组合,在 VB6 代码中使用不同的函数签名等。每个人都按预期工作,我无法重现您的错误。我倾向于@MarkJ 所说的,例外是VB6 中的某个地方。我没有主意了。
  • 也许你是对的。非常感谢你的努力,我给你一个赞成票
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多