从托管代码到非托管代码跨共享内存共享整数数组
本文关键字:共享 内存 数组 整数 托管代码 非托管代码 | 更新日期: 2023-09-27 18:10:52
我想分享一个固定大小的integer array
,从C#
中的Windows Service
到unmanaged C++
中编写的代码。这将跨越两个进程,C#
中的Windows Service
,到C++
中的另一个进程。
这个事务需要执行一次,并且它不是一个大数组,只是需要在两个共享内存之间传递。
实现这一目标的最有效方法是什么?也许与memory mapped files
,但我不确定如何将数据传递。
编辑
我不希望使用CLI
包装器,或P/INVOKE
(因为我知道这是时间昂贵的)。
我将继续内存映射,但我不确定数据如何在两个marshalled
和unmarshalled
之间。
在c#端,你可以使用MemoryMappedFile
类来访问内存映射文件。
在非托管端,您可以使用Windows API函数CreateFileMapping()
打开映射文件,然后使用MapViewOfFile
对文件中的数据获取void*
。然后,您可以将void*
强制转换为int*
,以访问作为整型数组的数据。
您可能还想使用一个命名的同步事件(在c#中使用EventWaitHandle
,在Windows API中使用CreateEvent()
)来通知MMF何时已被填充。
有不同的方法来实现这一点-
- 写一个小的CLI包装层。
- 使用共享资源。例如,以c#形式写入文件,然后用c++ 读取