Pinvoke委托:确保委托的生命周期和NullReferenceException

时间:2014-12-25 05:08:12

标签: c# delegates pinvoke marshalling nullreferenceexception

我编写了C#代码,它传递一个委托,由C ++作为函数指针调用。当C ++代码调用指向的函数时,我收到错误:

A first chance exception of type 'System.NullReferenceException' occurred
in PInvokeTest.exe Additional information: Object reference not set to an 
instance of an object.

可能导致这种情况的原因是什么?在this tutorial on Pinvoke中,作者引用了一篇MSDN文章:

...the application is responsible for somehow extending the lifetime of 
the delegate until no more calls will occur from unmanaged code...

这可能是问题吗?如果是,我不确定如何确保代表的生命周期足够长。

目前,我在一个类中定义了以下内容(该委托名为myCalllback

private static MyCallback _callbackInstance;

并在类方法中将其传递给C ++,其中包含以下内容:

_callbackInstance = new MyCallback(CallbackFunction);
setCallback(_callbackInstance);

其中CallbackFunction是静态函数,而setCallback是static extern函数。

1 个答案:

答案 0 :(得分:1)

  

应用程序负责以某种方式延长生命周期   代理,直到不再从非托管代码调用。

这个建议确实准确。你这样解决了这个问题:

private static MyCallback _callbackInstance;
....
_callbackInstance = new MyCallback(CallbackFunction);

只要您的代理人完成非托管代码,就不会分配给_callbackInstance,那么您确实可以根据需要延长其生命周期。

换句话说,你的程序显然有错误,但错误不在于你如何处理委托的生命周期。你需要到别处寻找你的缺陷。