Я думаю, что если вы объявите свою функцию setCallback следующим образом:
Public Sub setCallback([MarshalAs(UnmanagedType.FunctionPtr)]funcAddr as function)
Я не парень VB, поэтому не знаю точного синтаксиса. Но основная идея здесь в том, что в VB.Net вы объявляете прототип как делегат, даже делегат правильного типа. Но затем вы используете атрибут MarshalAs, чтобы сказать маршаллингу, чтобы он обрабатывал его как указатель на функцию (фактически целое число) с другой стороны. Я делаю это в C #, чтобы передать обратные вызовы в код C ++, и это прекрасно работает.
Например, это в C #
public delegate int MyProgress(double dPercentComplete);
...
int WaitWithProgress([MarshalAs(UnmanagedType.FunctionPtr)]MyProgress pfn);
Появляется на стороне C ++ дома, как это
HRESULT __stdcall WaitWithProgress (long pfn, int * pRetVal);
Обратите внимание на комментарии. Фактическое решение этой проблемы оказалось Marshal.GetFunctionPointerForDelegate()
, и будьте внимательны при чтении документации по этому вопросу. Если вы используете этот метод, вы обязаны убедиться, что делегат не является сборщиком мусора перед вами setCallback(NULL)