从托管代码到非托管代码跨共享内存共享整数数组

Share integer array across shared memory from Managed to Unmanaged code

本文关键字:共享 内存 数组 整数 托管代码 非托管代码      更新时间:2023-10-16

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

这个事务需要执行一次,并且它不是一个大数组,只是需要在两个共享内存之间传递。

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

编辑

我不希望使用CLI包装器,或P/INVOKE(因为我知道这是时间昂贵的)。

我将继续内存映射,但我不确定数据如何在两个marshalledunmarshalled之间。

在c#端,你可以使用MemoryMappedFile类来访问内存映射文件。

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

您可能还想使用一个命名的同步事件(在c#中使用EventWaitHandle,在Windows API中使用CreateEvent())来通知MMF何时已被填充。

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

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