【问题标题】:does GetComInterfaceForObject pin the object?GetComInterfaceForObject 是否固定对象?
【发布时间】:2009-06-30 17:05:45
【问题描述】:

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

  • 编辑 - 好的,我找到了一些信息,我想这可能就是答案。它处理委托,但我不得不相信调用 GetComInterfaceForObject 会执行相同的操作。

Source of the Following text

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

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

【问题讨论】:

    标签: c# interop


    【解决方案1】:

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

    【讨论】:

    • 太棒了!这就是我读完之后的想法。感谢您的回复,正在尝试追踪 AccessViolationExceptions。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2011-12-12
    • 2010-10-02
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多