Конечно, обратный вызов может работать. Вам понадобится указатель на функцию в коде C ++, примерно так:
typedef void (__stdcall * pfnCallback)(int progress, int* cancel);
extern "C" _declspec(dllexport)
uint8* resourceConsumingFunction(uint8* dataBuffer, pfnCallback callback)
{
for (int progress = 0;;) {
int cancel = 0;
callback(progress, &cancel);
if (cancel) return null;
// More code
//...
}
return dataBuffer;
}
И эквивалентный код C # будет:
private void delegate pfnCallback(int progress, out bool cancel);
private void makeCall() {
var callback = new pfnCallback(showProgress);
var bufptr = resourceConsumingFunction(somebuf, callback);
GC.KeepAlive(callback);
// etc...
}
private void showProgress(int progress, out bool cancel) {
// etc...
}
Использование __stdcall для обратного вызова помогает упростить объявление делегата. Вызов GC.KeepAlive () необходим для того, чтобы сборщик мусора не смог забрать объект делегата слишком рано.