将委托转换为非托管代码的文档指出,我有责任防止它自己被收集。我想知道在非托管呼叫进行时是否无法收集代表。例如,如果我这样做
UnmanagedFunction(arg => somebody);
其中 UnmanagedFunction 不存储函数指针超出它的调用。这应该是合法的吧?当 UnmanagedFunction 正在执行时,CLR 无法收集。
将委托转换为非托管代码的文档指出,我有责任防止它自己被收集。我想知道在非托管呼叫进行时是否无法收集代表。例如,如果我这样做
UnmanagedFunction(arg => somebody);
其中 UnmanagedFunction 不存储函数指针超出它的调用。这应该是合法的吧?当 UnmanagedFunction 正在执行时,CLR 无法收集。
根据CLR Inside Out: Marshaling between Managed and Unmanaged Code:
通常,您不必担心代表的生命周期。每当您将委托传递给非托管代码时,CLR 将确保委托在调用期间处于活动状态。
看来你没事。
既然你明确提到
UnmanagedFunction
不存储函数指针超出它的调用。
文章的下一段
但是,如果本机代码在调用范围之外保留指针的副本并打算稍后通过该指针进行回调,您可能需要使用
GCHandle
显式阻止垃圾收集器收集委托。
不适用。