我创建了一个.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兼容?
答案 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)