Вызов методов .NET из VB6 через видимую COM-библиотеку - PullRequest
2 голосов
/ 24 октября 2008

Я создал .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 ]

5 голосов
/ 24 октября 2008

Требуется объявить аргумент массива с помощью "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 голос
/ 05 октября 2009

Что-то связанное с этим было моей проблемой. У меня есть метод в C # со следующей подписью:

public long ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)

VB 6 продолжал жаловаться на «Функция или интерфейс, помеченный как ограниченный ...», и я предположил, что это был мой пользовательский объект, который я использую в вызове. Оказывается, VB 6 не может делать долго, пришлось сменить подпись на:

public int ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)
1 голос
/ 24 октября 2008

Попробуйте

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