如何检测来自非托管dll的哪个回调导致受保护的内存异常?

时间:2010-03-26 10:15:25

标签: .net clr callback unmanaged

我得到一个受保护的内存异常,但我怎么知道哪个调用引起了它,以及回调函数移动的原因?对非托管代码的所有调用都在与回调函数相同的类中完成,所以我认为地址不应该改变,或者我在这里完全错了?

1 个答案:

答案 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”来帮助您找到此类错误。