GetComInterfaceForObject将对象固定吗?

时间:2009-06-30 17:05:46

标签: c# interop

使用GetComInterfaceForObject并将返回的IntPtr传递给非托管代码会阻止托管对象在内存中移动吗?或者clr以某种方式保持那个ptr?请注意,非托管代码将在程序的生命周期中使用它,并且我需要确保GC不会移动托管对象。(至少我认为这是正确的吗?)

  • 编辑 - 好吧我找到了一些信息,我想这可能就是答案。它涉及代理,但我不得不相信调用GetComInterfaceForObject会做同样的事情。

Source of the Following text

“托管代理可以被编组为非托管代码, 它们作为非托管函数指针公开的位置。呼吁那些 指针将执行非托管到托管转换;改变 召集会议;进入正确的AppDomain;任何必要的 论证编组。显然,非托管函数指针必须引用a 固定地址。如果GC重新安置那将是一场灾难!这个 导致许多应用程序为委托创建固定句柄。这个 完全没必要。非托管函数指针实际上是指 到我们动态生成以执行转换的本机代码存根 &安培;封送处理。此存根存在于GC堆外部的固定内存中。

但是,应用程序负责以某种方式延长生命周期 委托代码,直到不再从非托管代码调用。该 本机代码存根的生命周期与其生命周期直接相关 代表。收集代表后,通过后续呼叫 非托管函数指针将崩溃或以其他方式破坏进程。在 我们最近发布的,我们添加了一个允许您使用的客户调试探针 在代码中干净地检测到这个常见的错误。如果你还没有 在开发过程中开始使用Customer Debug Probes,请看一下!“

1 个答案:

答案 0 :(得分:1)

当您的编辑状态(关于委托)时,您的托管对象不需要固定,因为GetComInterfaceForObject返回一个“固定”指针,该指针调用正确的托管对象。但是,只要COM客户端使用非托管指针,您就需要确保托管对象存在。