问题
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?
回答1:
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)
回答2:
Try
[ComVisible(true)]
bool Foo([In] ref byte[] a, [In] ref byte[] b, string c, ref string d)
回答3:
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)
来源:https://stackoverflow.com/questions/233284/calling-net-methods-from-vb6-via-com-visible-dll