2011-10-02 12 views
8

C++ dll kullanan bir C# projem var. (visual studio 2010'da)

C# kodundan C++ işlevine bir dizi int geçirmeliyim ve C++ kodu, C# koduna geri döndüğünde C# kodu aynı dizi içinde elemanlar ekleyecektir. .

Başlangıçta C# kodunda bir dizi (boyut 10000) olarak bildirildi ve C++ kodu eleman ekleyebiliyor (çünkü bu yalnızca bir dizi int, bellek ayırması aynıydı), ancak sorunlar çalışma zamanı hatası aldım dizinin dışına erişim nedeniyle.

C# dizisine C++ nasıl geçilir ve ek öğelerle C# 'ye geri dönülür?

Boyutu 100000'e kadar artırabilirim ancak yine de C++ kodunun ne kadar eleman ekleyeceğini bilmiyorum (hatta sadece 1 öğe olabilir).

Hem ortak hem de başka bir yol için ortak bir veri yapısı (dinamik dizi) var mı? Visual studio 2010 kullanıyorum.

Böyle bir şey yapmak istiyorum.
PS: derlenmiş kod değil ve burada int dizisi yerine char dizisi kullanılır.

C# kodu

[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++ kod yönetilen ve yönetilmeyen kod Here arasındaki dizilerin aktarılmasında hakkında iyi MSDN makale var

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

Bize bir kod göster –

+2

C++/CLI kullanabilir misiniz? C++/CLI kullanabilir misiniz? –

+2

Öğeleri bir diziye "ekleyemezsiniz". Diziler boyut olarak sabitlenmiştir. Farklı bir veri yapısı kullanın veya ikisi arasında nasıl bir arayüz oluşturduğunuzu değiştirin. –

cevap

3

. Soru şu ki, neden ilk sırada C# 'dan C++' a diziyi geçmek gerekiyor? Neden C++ tarafında (fnCPP yönteminizde) tahsisini yapamazsınız ve C# koduna bir işaretçi döndüremezsiniz ve 'u yet another Stackoverflow question'daki gibi kullanamazsınız? FnCSHARP yönteminden daha fazla, dizinin içeriğini, bazı değişken uzunluktaki veri yapısına (ör. Liste) kopyalayabilirsiniz.

+3

C++ 'ya bellek ayırır ve C#' ye döndürürseniz, daha sonra belleği boşaltmak için işaretçiyi C++ 'ya geri geçirmeniz gerekir. NET çöp toplayıcı burada size yardımcı olamaz. –