【问题标题】:How to share a big byte array between C++ and C#如何在 C++ 和 C# 之间共享一个大字节数组
【发布时间】:2011-05-30 02:49:27
【问题描述】:

我需要在驻留在 DLL 中的 C++ 程序和 C# 程序之间共享一个巨大的(数兆字节)字节数组。

我需要实时性能,所以我可以在两者之间以有效的方式共享它是非常重要的,因此每次在 C++ 中处理数据后都在 C# 中为其创建一个新副本不是一种选择,但是到目前为止我发现的例子似乎依赖于此。

是否可以有效地共享数组?如果有,怎么做?

【问题讨论】:

  • 告诉我你的线程模型。在并发意义上,对该数组的访问是否需要安全?
  • 我有一个问题:是否添加了 C++ 程序集作为对 C# 项目的引用?还是您使用互操作服务来访问它?

标签: c# c++ dll pointers bytearray


【解决方案1】:

.NET 封送拆收器是否传递副本,而不是引用?如果是这样,则调用 GCHandle.Alloc(array, GCHandleType.Pinned),然后您可以获取此 pinned 对象的地址并将其作为指针传递给 DLL。

【讨论】:

    【解决方案2】:

    使用内存映射文件。 .NET 中的 System.IO.MemoryMappedFiles 和 C++ 中的 CreateFileMapping。

    【讨论】:

    • 如果 C++ 代码是一个单独的程序而不是一个 DLL,这将是最好的。对于与 DLL 共享内存,它过于复杂。
    • ...并且它仅适用于从 .NET 4 开始
    【解决方案3】:

    在当前版本的 .NET 中,任何数兆字节的数组最终都将位于大对象堆上并且永远不会移动。但是,为了安全起见,您应该像 fejesjoco 所说的那样固定阵列。然后 C++ 代码可以将一个指针保存到 .NET 数组中并就地更新它。

    【讨论】:

    • 我会小心的。如果它最终小于 16kb,它可以并且将被放置在 LFH 中。只是需要注意的事情。
    • .NET 不使用操作系统堆、低碎片或其他。它进行自己的内存管理。并且固定适用于所有大小的数组,即使它们最终位于分代堆而不是 LOH。
    【解决方案4】:

    在 vb.net 中,我通过传递对第一个字节的引用来实现这一点。没有类型检查来确保传递的确实是正确大小的数组,但只要例程正在运行,数组就会被固定。

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 2012-07-26
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2012-10-27
      • 2013-07-26
      相关资源
      最近更新 更多