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

时间:2013-06-22 14:22:58

标签: c# .net delegates garbage-collection clr

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

UnmanagedFunction(arg => somebody);

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

1 个答案:

答案 0 :(得分:4)

根据CLR Inside Out: Marshaling between Managed and Unmanaged Code

  

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

好像你没事。

由于您明确提到

  

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

文章的下一段

  

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

适用。