2010-12-23 55 views
2

我需要在驻留在DLL和C#程序中的C++程序之间共享一个巨大的(很多兆字节)字节数组。如何在C++和C#之间共享一个大的字节数组

我需要实时性能,所以它是非常重要的,我可以以有效的方式在两者之间共享它,所以每次在C++中操作数据之后在C#中为它创建一个新副本都不是一种选择,但我迄今发现的例子似乎取决于此。

是否有可能以有效的方式共享数组?如果是这样,怎么样?

+0

告诉我你的线程模型。在并行的意义上,访问该数组是否需要安全? – 2010-12-23 19:55:00

+0

我有一个问题:是否将C++程序集添加为C#项目的引用?或者你使用互操作服务来访问它? – Vercas 2010-12-23 22:49:25

回答

1

.NET封送器是否传递一个副本,而不是引用?如果是这样,然后调用GCHandle.Alloc(array,GCHandleType.Pinned),那么你可以得到这个固定对象的地址,并将它作为一个指针传递给DLL。

2

使用内存映射文件。 .NET中的System.IO.MemoryMappedFiles和C++中的CreateFileMapping。

+0

如果C++代码是一个单独的程序而不是DLL,这将是最好的。为了与DLL共享内存,它过于复杂。 – 2010-12-23 19:04:44

4

在当前版本的.NET中,任何数兆字节的数组将最终放在大对象堆上,并且不会移动。然而,为了安全起见,你应该将这个数组作为fejesjoco所说的。然后C++代码可以将指针保存到.NET数组中,并在原地进行更新。

0

在vb.net中,我通过传递第一个字节的引用来完成此操作。没有类型检查来确保传递的是真正的大小数组,但只要例程正在运行,数组将被固定。