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.
这可能是什么原因造成的?在中,作者引用了MSDN的一篇文章,其中写道: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
...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
,那么就确实可以根据需要延长其生命周期
换句话说,您的程序显然有一个错误,但这个错误并不在于您如何处理代理的生命周期。你需要到别处去寻找你的缺点在提交C++方法之前,你是否已经把你的委托给我了?我没有给委托签名。就在我在教程中引用的那行之前,它说“这会导致许多应用程序为委托创建一个固定句柄。这是完全不必要的…”(整个引用不适合此注释)。如果方法调用是同步的,则不需要固定委托。如果非托管方法存储了函数指针,以便稍后在某个点调用函数,则必须固定委托(至少如作者所说保持其活动状态)。这就是作者在这里所说的,应用程序负责以某种方式延长委托的生存期,直到不再出现来自非托管代码的调用。几乎所有
NullReferenceException
的情况都是相同的。请在某些提示中看到“”。在托管类型中分配字段与传递C++代码的方式不一样。如果您想获得有关问题的特定帮助,则需要提供一个好的、特定的代码示例。看见
private static MyCallback _callbackInstance;
....
_callbackInstance = new MyCallback(CallbackFunction);