I have created a .NET DLL which makes some methods COM visible.
One method is problematic. It looks like this:
bool Foo(byte[] a, ref byte[] b, string c, ref string d)
VB6 gives a compile error when I attempt to call the method:
Function or interface marked as
restricted, or the function uses an
Automation type not supported in
Visual Basic.
I read that array parameters must be passed by reference, so I altered the first parameter in the signature:
bool Foo(ref byte[] a, ref byte[] b, string c, ref string d)
VB6 still gives the same compile error.
How might I alter the signature to be compatible with VB6?
Declaring the array argument with "ref" is required. Your 2nd attempt should have worked just fine, perhaps you forgot to regenerate the .tlb?
Tested code:
[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)
Try
[ComVisible(true)]
bool Foo([In] ref byte[] a, [In] ref byte[] b, string c, ref string d)
Something related to this was my problem. I have a method in C# with the following signature:
public long ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)
VB 6 kept on complaining "Function or interface marked as restricted ..." and I assumed it was my custom object I use in the call. Turns out VB 6 can not do long, had to change the signature to:
public int ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)