Как я могу определить, какой обратный вызов из неуправляемой библиотеки DLL вызывает исключение защищенной памяти? - PullRequest
1 голос
/ 26 марта 2010

Я получаю исключение для защищенной памяти, но как узнать, какой вызов вызвал его, и почему функция обратного вызова была перемещена? Все вызовы неуправляемого кода выполняются в том же классе, что и функции обратного вызова, поэтому я полагаю, что адреса не должны изменяться, или я здесь совершенно не прав?

1 Ответ

2 голосов
/ 26 марта 2010

Чтобы нативный код мог перезвонить в управляемый код, вам нужен делегат обратного вызова (если мы не говорим о взаимодействии COM). И наиболее распространенной причиной ошибок является то, что делегат обратного вызова является сборщиком мусора до того, как произойдет последний обратный вызов. Неважно, в каком классе определена цель обратного вызова, но важно поддерживать работу делегата.

Возможность просто указать имя метода и позволить компилятору C # создать временный делегат для вас делает эту ошибку еще более распространенной. То есть вместо

SetCallback(MyCallbackMethod);  // No good since you can't keep reference to delegate

сделать это

_callback = MyCallbackMethod;   // Create delegate explicitly and store reference at class level
SetCallback(_callback);

Вы можете включить « управляемых помощников по отладке », чтобы помочь вам найти этот тип ошибки.

...