2011-10-02 74 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垃圾回收器在這裏無法幫到你。 –

相關問題