通过COM可见DLL从VB6调用.NET方法

时间:2008-10-24 12:23:45

标签: .net arrays com vb6 assemblies

我创建了一个.NET DLL,它使一些方法COM可见。

一种方法存在问题。它看起来像这样:

bool Foo(byte[] a, ref byte[] b, string c, ref string d)

当我尝试调用方法时,VB6出现编译错误:

  

标记为的功能或界面   限制,或功能使用   不支持自动化类型   Visual Basic。

我读过数组参数必须通过引用传递,所以我改变了签名中的第一个参数:

bool Foo(ref byte[] a, ref byte[] b, string c, ref string d)

VB6仍然会产生相同的编译错误。

如何更改签名以与VB6兼容?

3 个答案:

答案 0 :(得分:5)

需要使用“ref”声明数组参数。你的第二次尝试应该运行得很好,也许你忘了重新生成.tlb?

经过测试的代码:

[ComVisible(true)]
public interface IMyInterface {
 bool Foo(ref byte[] a, ref byte[] b,string c, ref string d);
}

[ComVisible(true)]
public class MyClass : IMyInterface {
  public bool Foo(ref byte[] a, ref byte[] b, string c, ref string d) {
    throw new NotImplementedException();
  }
}


  Dim obj As ClassLibrary10.IMyInterface
  Set obj = New ClassLibrary10.MyClass
  Dim binp() As Byte
  Dim bout() As Byte
  Dim sinp As String
  Dim sout As String
  Dim retval As Boolean
  retval = obj.Foo(binp, bout, sinp, sout)

答案 1 :(得分:1)

尝试

[ComVisible(true)]
bool Foo([In] ref byte[] a, [In] ref byte[] b, string c, ref string d)

答案 2 :(得分:1)

与此相关的是我的问题。我在C#中有一个带有以下签名的方法:

public long ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)

VB 6继续抱怨“功能或界面标记为限制......”我认为这是我在通话中使用的自定义对象。原来VB 6做不了多久,不得不将签名改为:

public int ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)