将共享内存中的整数数组从托管代码共享到非托管代码

时间:2015-09-02 08:44:04

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

我希望与integer array Windows Service中的C#之间的unmanaged C++共享一个固定大小的Windows Service。这将跨越两个流程,C#中的C++memory mapped files中的另一个流程。

这个事务需要完成一次,并且它不是一个大数组,只需要通过两者之间的共享内存传递它。

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

编辑 -

我不想使用P/INVOKE包装,或marshalled(因为我知道它的时间很贵)。

我会继续进行内存映射,但我不确定两者之间的数据是unmarshalledCGRect textViewFrame; if(IS_IPHONE_5) textViewFrame = CGRectMake(0.0f, 64.0f, 320.0f, 390.0f); else textViewFrame = CGRectMake(0.0f, 64.0f, 320.0f, 320.0f); textViewText = [[UITextView alloc] initWithFrame:textViewFrame]; textViewText.returnKeyType = UIReturnKeyDone; textViewText.delegate = self; textViewText.backgroundColor = [UIColor clearColor]; [self.view addSubview:textViewText]; [self.textViewText setFont:[UIFont fontWithName:@"PT Mono" size:16]]; [self.textViewText setTextColor:[UIColor colorWithRed:32.0f/255.0f green:32.0f/255.0f blue:32.0f/255.0f alpha:1]];

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

您可能还希望使用命名同步事件(使用C#中的EventWaitHandle和Windows API中的CreateEvent())来指示MMF何时被填充。