如何将C#数组传递给C++并在返回时添加附加项呢?

13

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

我需要从C#代码传递一个int数组到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
}

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;
}

2
你会使用C++/CLI吗?你会使用C++/CLI吗? - David Heffernan
2
你不能“添加”项目到一个数组中。数组的大小是固定的。使用不同的数据结构或改变两者之间的接口。 - Jeff Mercado
@Jeff,那不完全是“添加”,我已经添加了代码来清除我的部分。 - Vikas Kumar
1个回答

8

有一篇很好的MSDN文章介绍了如何在托管和非托管代码之间传递数组,请点击这里。问题是,为什么需要首先从C#将数组传递给C++?为什么不能在C++中进行分配(在您的fnCPP方法中),然后返回指向C#代码的指针,并像另一个Stackoverflow问题中那样使用Marshal.Copy( source, destination, 0, size )?然后在您的fnCSHARP方法中,您可以将数组内容复制到某个可变长度数据结构(例如List)中。


9
如果你在C++中分配了内存并将其返回给C#,那么你需要稍后将指针传回C++以释放内存。.NET垃圾回收器无法帮助你处理这里的问题。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接