如何将C#数组传递给C++并将其返回给C#并附加其他项?

Vik*_*mar 12 c# c++ arrays marshalling

我有一个使用C++ DLL的C#项目.(在visual studio 2010中)

我必须将一个int数组从C#代码传递给C++函数,而C++函数将在数组中添加少量元素,当控件返回C#代码时,C#代码也会在同一个数组中添加元素.

最初我在C#代码中声明了一个数组(大小为10000),C++代码能够添​​加元素(因为它只是一个int数组,内存分配是相同的),但问题是我因访问而遇到运行时错误在阵列的一边.

我可以将大小增加到100000,但我不知道C++代码将添加多少元素(即使它只能是1个元素).

那么有两种或其他方式存在共同的数据结构(动态数组)吗?我正在使用Visual Studio 2010.

我想做的事情就像这样.
PS:没有编译代码,这里我使用char数组而不是int数组.

C#代码

[DllImport("example1.dll")]
private static extern int fnCPP (StringBuilder a,int size)
...

private void fnCSHARP(){
    StringBuilder buff = new StringBuilder(10000);
    int size=0;
    size = fnCPP (buff,size);
    int x = someCSHARP_fu();
    for ( int i=size; i < x+size; i++) buff[i]='x';// possibility of run time error
}
Run Code Online (Sandbox Code Playgroud)

C++代码

int fnCPP (char *a,int size){
  int x = someOtherCpp_Function();
  for( int i=size; i < x+size ; i++) a[ i ] = 'x'; //possibility of run time error 
  return size+x;
}
Run Code Online (Sandbox Code Playgroud)

Ami*_*ira 8

有一个关于托管和非托管代码之间传递数组一个很好的MSDN文章在这里.问题是,为什么你需要首先将数组从C#传递给C++?为什么不能在C++端(在fnCPP方法中)进行分配,并返回指向C#代码的指针,而不仅仅是Marshal.Copy( source, destination, 0, size )另一个Stackoverflow问题中使用?与fnCSHARP方法相比,您可以将数组的内容复制到某个可变长度的数据结构(例如List).

  • 如果在C++中分配内存并将其返回到C#,则需要稍后将指针传递回C++以释放内存..NET垃圾收集器在这里无法帮助您. (5认同)