如何将c#数组传递给c++,并将其与附加项一起返回给c#

本文关键字:一起 返回 c++ 数组 | 更新日期: 2023-09-27 18:10:18

我有一个使用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
}

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

如何将c#数组传递给c++,并将其与附加项一起返回给c#

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