2011-10-02 49 views
8

我有一个C#项目正在使用C++ DLL。 (在Visual Studio 2010)

我不得不INT的从C#代码一个数组传递到C++函数和C++时控制又回到C#代码功能将加在阵列中,少量元素,C#代码也将增加在相同的数组元素。

最初我声明在C#代码和C一阵列(的大小10000)++代码能够添​​加元素(因为它只是一个int数组,存储器分配是相同的),但存在的问题是我有运行时间错误由于访问数组的一面。

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

我可以将大小增加到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; 
} 
+0

向我们展示一些代码 –

+2

你可以使用C++/CLI?你可以使用C++/CLI? –

+2

您无法将项目“添加”到数组中。数组的大小是固定的。使用不同的数据结构或更改两者之间的连接方式。 –

回答

3

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

+3

如果您使用C++分配内存并将其返回给C#,则需要稍后将指针传递回C++以释放内存。 .NET垃圾回收器在这里无法帮到你。 –

相关问题