【发布时间】:2009-06-30 17:05:45
【问题描述】:
使用 GetComInterfaceForObject 并将返回的 IntPtr 传递给非托管代码是否会阻止托管对象在内存中移动?或者 clr 是否以某种方式维护该 ptr?请注意,非托管代码将在程序的生命周期内使用它,我需要确保托管对象不会被 GC 移动。(至少我认为这是对的?)
- 编辑 - 好的,我找到了一些信息,我想这可能就是答案。它处理委托,但我不得不相信调用 GetComInterfaceForObject 会执行相同的操作。
"托管委托可以编组为非托管代码, 它们作为非托管函数指针公开。呼吁那些 指针将执行非托管到托管的转换;变化 调用约定;进入正确的 AppDomain;以及任何必要的 论据编组。显然,非托管函数指针必须引用 固定地址。如果 GC 重新定位它,那将是一场灾难!这 导致许多应用程序为委托创建固定句柄。这 完全没有必要。非托管函数指针实际上是指 到我们动态生成以执行转换的本机代码存根 & 编组。此存根存在于 GC 堆外的固定内存中。
但是,应用程序负责以某种方式延长生命周期 委托,直到不再有来自非托管代码的调用。这 本机代码存根的生命周期与 代表。收集委托后,后续调用将通过 非托管函数指针将崩溃或以其他方式破坏进程。在 在我们最近的版本中,我们添加了一个客户调试探针,它允许您 在您的代码中干净地检测到这个非常常见的错误。如果你还没有 在开发过程中开始使用 Customer Debug Probes,请看一下!”
【问题讨论】: