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

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

UnmanagedFunction(arg => somebody); 

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

根据CLR Inside Out:托管和非托管代码之间的密钥 :

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

好像你没事。

既然你明确提到了

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

文章的下一段

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

不适用。