-1

我有三个非托管 dll 函数:

void Init(){}
void Run(){}
void Done(){}

它们使用相同的托管对象。Init() 函数初始化对象, Run() 使用它, Done() 清除它。

我的主要问题是:是否有必要对此类对象使用 GCHandle.Alloc(managedObject, GCHandleType.Pinned) (固定它)?

4

1 回答 1

1

每当您将对象传递给非托管代码时,您都需要固定对象,该代码存储它并稍后尝试访问它。因此,如果您将对象传递给您的 Init 函数,该函数存储其地址以便稍后在调用 Run 函数时访问它,您必须固定它,因为地址可以在调用 Init 和 Run 函数之间更改。

总而言之:GC 在托管对象周围移动。因此,如果非托管代码试图访问您的内存,您最好将其固定。否则,非托管代码可能会访问导致 undef 的完全不同的东西。行为。

于 2013-11-24T16:26:26.700 回答