正在阻止非托管函数指针垃圾收集

本文关键字:指针 函数 | 更新日期: 2023-09-27 18:19:34

将委托转换为非托管代码的文档指出,我自己负责阻止它的收集。我想知道在非托管调用处于活动状态时是否无法收集委托。例如,如果我做

UnmanagedFunction(arg => somebody);

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

正在阻止非托管函数指针垃圾收集

根据CLR Inside-Out:托管和非托管代码之间的封送:

通常,您不必担心代理的使用寿命。无论何时将委托传递给非托管代码,CLR都会确保该委托在调用期间处于活动状态。

看来你还好。

既然你明确提到

UnmanagedFunction不会在调用之后存储函数指针。

文章的下一段

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

不适用