从托管代码到非托管代码在共享内存中共享整数数组
Share integer array across shared memory from Managed to Unmanaged code
我想分享一个固定大小的 integer array
,从 C#
中的 Windows Service
到 unmanaged C++
中编写的代码。这将跨越 2 个进程,C#
中的 Windows Service
,到 C++
中的另一个进程。
这个事务需要做一次,而且不是一个大数组,只是需要传递,跨越两者之间的共享内存。
实现此目标的最有效方法是什么?也许使用 memory mapped files
,但我不确定数据将如何传递。
编辑 -
我不想使用 CLI
包装器,或者P/INVOKE
(因为我知道这很费时间)。
我将继续进行内存映射,但我不确定两者之间的数据如何 marshalled
和 unmarshalled
。
有不同的方法可以实现这一点 -
- 编写一个小的 CLI 包装层。
- 使用共享资源。例如以文件形式写入 c#,然后以 c++
读取
在 C# 端,您可以使用 MemoryMappedFile
class 访问内存映射文件。
在非托管方面,您可以使用 Windows API 函数 CreateFileMapping()
to open the mapped file, and then use MapViewOfFile
获取文件中数据的 void*
。然后,您可以将 void*
转换为 int*
以将数据作为整数数组访问。
您可能还想使用命名的同步事件(在 Windows API 中使用 EventWaitHandle
in C# and CreateEvent()
)在 MMF 已填充时发出信号。
我想分享一个固定大小的 integer array
,从 C#
中的 Windows Service
到 unmanaged C++
中编写的代码。这将跨越 2 个进程,C#
中的 Windows Service
,到 C++
中的另一个进程。
这个事务需要做一次,而且不是一个大数组,只是需要传递,跨越两者之间的共享内存。
实现此目标的最有效方法是什么?也许使用 memory mapped files
,但我不确定数据将如何传递。
编辑 -
我不想使用 CLI
包装器,或者P/INVOKE
(因为我知道这很费时间)。
我将继续进行内存映射,但我不确定两者之间的数据如何 marshalled
和 unmarshalled
。
有不同的方法可以实现这一点 -
- 编写一个小的 CLI 包装层。
- 使用共享资源。例如以文件形式写入 c#,然后以 c++ 读取
在 C# 端,您可以使用 MemoryMappedFile
class 访问内存映射文件。
在非托管方面,您可以使用 Windows API 函数 CreateFileMapping()
to open the mapped file, and then use MapViewOfFile
获取文件中数据的 void*
。然后,您可以将 void*
转换为 int*
以将数据作为整数数组访问。
您可能还想使用命名的同步事件(在 Windows API 中使用 EventWaitHandle
in C# and CreateEvent()
)在 MMF 已填充时发出信号。