我有三个非托管的dll函数:
void Init(){}
void Run(){}
void Done(){}
它们使用相同的托管对象。Init() 函数在对象中,Run() 使用它,Done() 清除它。
我的主要问题是:是否有必要使用GCHandle.Alloc(managedObject,GCHandleType.Pinned)来定位这样的对象(固定它)?
每当将对象传递给非托管代码时,都需要固定对象,非托管代码存储该对象并在以后尝试访问它。因此,如果将对象传递给 Init 函数,该函数存储其地址以便稍后在调用 Run 函数时访问它,则必须固定它,因为地址可以在调用 Init 和 Run 函数之间更改。
总而言之:GC 在托管对象周围移动。因此,如果非托管代码尝试访问内存,则最好将其固定。否则,非托管代码可能会访问导致 undef 的完全不同的内容。行为。