我有一个使用 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;
}
最佳答案
有一篇关于在托管和非托管代码之间传递数组的好 MSDN 文章 Here .问题是,为什么首先需要将数组从 C# 传递到 C++?为什么你不能在 C++ 端进行分配(在你的 fnCPP 方法中),并返回一个指向 C# 代码的指针,而不仅仅是使用 Marshal.Copy(source, destination, 0, size)
如 yet another Stackoverflow question ?与您的 fnCSHARP 方法相比,您可以将数组的内容复制到一些可变长度的数据结构(例如列表)。
关于c# - 如何将 C# 数组传递给 C++ 并将其返回给 C# 以及其他项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7624561/