Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有三个非托管 dll 函数:
void Init(){} void Run(){} void Done(){}
它们使用相同的托管对象。Init() 函数初始化对象, Run() 使用它, Done() 清除它。
我的主要问题是:是否有必要对此类对象使用 GCHandle.Alloc(managedObject, GCHandleType.Pinned) (固定它)?
每当您将对象传递给非托管代码时,您都需要固定对象,该代码存储它并稍后尝试访问它。因此,如果您将对象传递给您的 Init 函数,该函数存储其地址以便稍后在调用 Run 函数时访问它,您必须固定它,因为地址可以在调用 Init 和 Run 函数之间更改。
总而言之:GC 在托管对象周围移动。因此,如果非托管代码试图访问您的内存,您最好将其固定。否则,非托管代码可能会访问导致 undef 的完全不同的东西。行为。