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