【问题标题】:Share integer array across shared memory from Managed to Unmanaged code从托管代码到非托管代码跨共享内存共享整数数组
【发布时间】:2015-09-02 08:44:03
【问题描述】:

我希望分享一个固定大小的integer array,从C# 中的Windows Serviceunmanaged C++ 中编写的代码。这将跨越 2 个进程,C# 中的 Windows ServiceC++ 中的另一个进程。

这个事务需要做一次,而且不是一个大数组,只是需要传递,跨越两者之间的共享内存。

实现这一目标的最有效方法是什么?也许使用memory mapped files,但我不确定数据将如何传递。

编辑 -

我不希望使用CLI 包装器或P/INVOKE(因为我知道这很耗时)。

我将继续进行内存映射,但我不确定数据是如何跨越两者的marshalledunmarshalled

【问题讨论】:

  • 尝试编写低延迟代码。据我了解,P/Invoke 需要时间。
  • 我想我会使用内存映射文件,但我不确定如何在托管端对数据进行编组,然后在另一端进行解组。
  • 您通常只使用内存映射文件在两个独立进程之间传输数据。您的问题并不清楚您实际上是在使用两个单独的进程,还是只是想在非托管 DLL 中创建一个进程内调用代码。是哪一个?使用 MMF 在进程内传输数据可能比仅使用 P/Invoke 调用传输数组要慢。
  • 不,您只需使用MemoryMappedViewAccessor.Write()MemoryMappedViewAccessor.WriteArray() 来写入整数。它将在进程之间对齐。你读过the documentation for MMFs吗? (当然,您需要对非托管代码使用 Windows API 函数。)

标签: c# c++ arrays shared-memory memory-mapped-files


【解决方案1】:

在 C# 端,您可以使用 MemoryMappedFile 类访问内存映射文件。

在非托管端,您可以使用 Windows API 函数 CreateFileMapping() 打开映射文件,然后使用 MapViewOfFile 获取文件中数据的 void*。然后,您可以将 void* 转换为 int* 以将数据作为整数数组访问。

您可能还想使用命名同步事件(在 C# 中使用 EventWaitHandle 和在 Windows API 中使用 CreateEvent())在 MMF 已填充时发出信号。

【讨论】:

    【解决方案2】:

    有不同的方法来实现这一点 -

    1. 编写一个小的 CLI 包装层。
    2. 使用共享资源。例如以 c# 形式写入文件,然后以 c++ 读取

    【讨论】:

    • 我不想编写 CLI 包装器。对于第二个选项,您能详细说明一下吗?
    • @user1173240 使用 C# 将数组写入文本文件,然后使用 c++ 读取该文件。例如您可以将数组存储为逗号分隔的int,然后在使用 c++ 读取时使用逗号作为分隔符来分隔它
    • 好的,我了解共享资源。但数据是敏感数据,不能写入文本文件等资源。
    • 如果数据很敏感,您可以在写入前使用加密,在读取前使用相同的解密。
    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 2011-11-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多