C# Pinvoke委托:确保委托和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.

C# Pinvoke委托:确保委托和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.,c#,delegates,pinvoke,marshalling,nullreferenceexception,C#,Delegates,Pinvoke,Marshalling,Nullreferenceexception,这可能是什么原因造成的?在中,作者引用了MSDN的一篇文章,其中写道: ...the application is responsible for somehow extending the lifetime of the delegate until no more calls will occur from unmanaged code... 这可能是问题所在吗?如果是,我不确定如何确保委托的生命周期足够长 目前,我在一个类中定义了以下内容(委托名为mycallback) 并将其传递到C

这可能是什么原因造成的?在中,作者引用了MSDN的一篇文章,其中写道:

...the application is responsible for somehow extending the lifetime of 
the delegate until no more calls will occur from unmanaged code...
这可能是问题所在吗?如果是,我不确定如何确保委托的生命周期足够长

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

并将其传递到C++中的类方法中:

_callbackInstance = new MyCallback(CallbackFunction);
setCallback(_callbackInstance);
其中,
CallbackFunction
是一个静态函数,setCallback是一个
staticextern
函数

应用程序负责以某种方式延长 委托,直到非托管代码不再调用为止

这个建议确实是正确的。你可以这样来解决这个问题:

private static MyCallback _callbackInstance;
....
_callbackInstance = new MyCallback(CallbackFunction);
只要在委托完成非托管代码之前不将其分配给
\u callbackInstance
,那么就确实可以根据需要延长其生命周期


换句话说,您的程序显然有一个错误,但这个错误并不在于您如何处理代理的生命周期。你需要到别处去寻找你的缺点NullReferenceException的情况都是相同的。请在某些提示中看到“”。在托管类型中分配字段与传递C++代码的方式不一样。如果您想获得有关问题的特定帮助,则需要提供一个好的、特定的代码示例。看见
private static MyCallback _callbackInstance;
....
_callbackInstance = new MyCallback(CallbackFunction);