非托管Dll调用和固定托管对象

时间:2013-11-10 23:03:02

标签: dll unmanaged managed

我有三个非托管dll函数:

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

他们使用相同的托管对象。 Init()函数在对象中,Run()使用它,Done()清除它。

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

1 个答案:

答案 0 :(得分:1)

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

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