我得到一个受保护的内存异常,但我怎么知道哪个调用引起了它,以及回调函数移动的原因?对非托管代码的所有调用都在与回调函数相同的类中完成,所以我认为地址不应该改变,或者我在这里完全错了?
答案 0 :(得分:2)
要使本机代码回调到托管代码,您需要一个回调委托(只要我们不讨论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);
您可以启用“managed debug assistants”来帮助您找到此类错误。