2011-10-02 16 views
8

Tengo un proyecto C# que está usando un dll C++. (En Visual Studio 2010)

tengo que pasar una matriz de int a partir del código de C a C función ++ y C++ función añadirá unos elementos en serie, cuando el control vuelve al código C#, C# código también añadirá elementos en mismo array .

Inicialmente I declaró una matriz (del tamaño de 10000) en el código C# y C++ código es capaz de añadir elementos (porque era sólo una matriz de int, asignación de memoria es igual), pero los problemas es que he obtenido un error de tiempo de ejecución debido al acceso fuera del conjunto.

¿Cómo pasar la matriz C# a C++ y devolverla a C# con elementos adicionales?

Puedo aumentar el tamaño a 100000 pero de nuevo no sé cuánto agregará el código C++ (incluso puede ser solo 1 elemento).

Entonces, ¿existe una estructura de datos común (matriz dinámica) para ambas u otras formas de hacerlo? Estoy utilizando Visual Studio 2010.

Algo como esto lo que quiero hacer.
PD: código no compilado, y aquí utilicé la matriz char en lugar de la matriz int.

código 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ódigo 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

nos muestran algo de código –

+2

Se puede utilizar C++/CLI? ¿Se puede utilizar C++/CLI? –

+2

No puede "agregar" elementos a una matriz. Las matrices están fijadas en tamaño. Usa una estructura de datos diferente o cambia la forma en que interactúas entre los dos. –

Respuesta

3

Hay un buen artículo de MSDN sobre pasar matrices entre el código administrado y no administrado Here. La pregunta es, ¿por qué necesitarías pasar la matriz de C# a C++ en primer lugar? ¿Por qué no puede hacer la asignación en el lado C++ (en su método fnCPP), y devolver un puntero al código C#, y simplemente usar Marshal.Copy(source, destination, 0, size) como en yet another Stackoverflow question? En su método fnCSHARP, puede copiar el contenido de la matriz a una estructura de datos de longitud varaiable (por ejemplo, Lista).

+3

Si asigna memoria en C++ y devolverlo a C#, que necesita para pasar más tarde el puntero de nuevo a C++ para liberar la memoria. El recolector de basura de .NET no puede ayudarte aquí. –

Cuestiones relacionadas