【问题标题】:Do i need to pin data when working with C# and C++/CX使用 C# 和 C++/CX 时是否需要固定数据
【发布时间】:2013-06-16 02:27:31
【问题描述】:

当在 C# 和 C++/CX 之间的层上下发送数据时,我是否需要固定数据,在我使用 GCHandleType.Pinned 之前,我是否仍然需要它,或者不像现在我已经迁移到 @ 987654322@ ?如果是这样,我该怎么做?和以前一样吗?

谢谢!!

【问题讨论】:

  • C++/CX 仍然是本机代码,它根本不使用 .NET。如果之前需要固定,那么现在仍然需要。
  • 但是,作为应用程序开发人员,我认为这并不一定意味着您需要明确固定 - 因为这似乎由 Windows 运行时处理。

标签: c# c++-cx


【解决方案1】:

我认为您不需要固定数据。固定意味着垃圾收集器不会压缩您的对象,从而导致本机指针引用出错。使用 WinRT,您的类是一个 COM 对象,它是引用计数的,而不是垃圾收集的。所以对象存在于本机堆上,不会被压缩/重定位。

【讨论】:

  • 感谢您的评论,我正在发送数据而不进行固定,并希望数据不会出错,将进行一些测试,并让您知道在哪些情况下我必须固定数据,基本测试表明它没有爆炸:P
  • 当您考虑一个实现 C++/CX 中定义的接口类的 .NET 对象时,它确实很有趣 - 是否会被引用计数或垃圾收集(或两者兼而有之)?
  • 好点 Paul,虽然不确定,但我的猜测是创建对象的人会调用它的垃圾收集器,但这是我的假设,可以花几分钟时间搜索它,但我怀疑我会找到任何东西,C++/CX 上的资源非常低.. :/
  • 任何实现 WinRT 接口的公共类(无论接口或类是用哪种语言定义的)本质上都是引用计数的,因为它是由Windows 运行时。在 .NET 中,他们创建 RCW(运行时可调用包装器)。本质上,它是一个存在于 GC 上的对象,其中包含一个对由 Windows 运行时激活的类的引用计数。该 RCW 通过 GC 进行跟踪,当不再存在对它的引用时,将对其进行清理,并且其对 WinRT 对象的单个引用计数递减,从而清理该底层对象。
  • @AndyRich 所以有 2 个对象(一个在托管堆中,一个在本机堆中)?
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 2013-02-20
  • 2021-01-30
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多