防止非托管函数指针垃圾回收

Pup*_*ppy 5 .net c# clr delegates garbage-collection

将代理转换为非托管代码的文档说明我自己负责阻止代理收集.我想知道在非管理呼叫是否有效的情况下是否无法收集代表.例如,如果我这样做

UnmanagedFunction(arg => somebody);
Run Code Online (Sandbox Code Playgroud)

其中UnmanagedFunction不存储超出其调用的函数指针.这应该是合法的,对吧?在UnmanagedFunction正在执行时,CLR无法收集.

jas*_*son 4

根据《CLR Inside Out:托管代码和非托管代码之间的封送处理》:

通常,您不必担心代表的生命周期。每当您将委托传递给非托管代码时,CLR 都会确保该委托在调用期间处于活动状态

看来你没事。

既然你明确提到

UnmanagedFunction不存储超出其调用范围的函数指针。

文章的下一段

但是,如果本机代码在调用范围之外保留指针的副本,并打算稍后通过该指针回调,则可能需要使用GCHandle显式阻止垃圾收集器收集委托。

适用