Чтобы нативный код мог перезвонить в управляемый код, вам нужен делегат обратного вызова (если мы не говорим о взаимодействии 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);
Вы можете включить « управляемых помощников по отладке », чтобы помочь вам найти этот тип ошибки.