struct de c# a c y vuelta

22/12/2006 - 14:03 por moga | Informe spam
Hola,

Parecido al paso de parámetros de char* de una consulta anterior.
Ahora me encuentro con problemas al pasar un parámetro struct. Me
explico:

Libreria C, (dll):
// La estructura de datos.
struct estructura {
char nombre[100];
int valor;
}

DllExport int funcion(struct estructura *datos) {
struct estructura *temporal;

// Operaciones para llenar el array.
// ...

// Devolver el array, (parámetro por referencia).
memset(datos, 0, sizeof(struct estructura));
memcpy(datos, temporal, sizeof(struct estructura));
free((void *)temporal);
}



Y en C#:
// La estructura en c#
[StructLayout(LayoutKind.Sequential)]
public class est_info_prob_pal {
public char[] nombre;
public int valor;
}

// La función para usar desde C#
[DllImport(baseDir + "libreriaC.dll")]
unsafe private extern static int funcion([Out,
MarshalAs(UnmanagedType.LPStruct)] estructura datos);
public static estructura laFuncion() {
estructura datos = new estructura();
datos.nombre = new char[100];

int ret = funcion(datos);
return datos;
}


Esto produce un error de corrupción de memória al hacer la llamada a
funcion(datos) desde C#.
La idea es que desde C# pase una estructura de datos que la librería C
cambiará y los devolverá por referencia. He intentado hacer algo
parecido a lo que he hecho para pasar por referencia char*, pero no
funciona. ¿Alguien podria decirme que estoy haciendo mal?

Saludos,
Jose Luis
 

Leer las respuestas

#1 Bela Istok
26/12/2006 - 20:40 | Informe spam
Agregale la palabra ref al parametro ;)

Saludos,

Bela Istok
"moga" wrote in message
news:
Hola,

Parecido al paso de parámetros de char* de una consulta anterior.
Ahora me encuentro con problemas al pasar un parámetro struct. Me
explico:

Libreria C, (dll):
// La estructura de datos.
struct estructura {
char nombre[100];
int valor;
}

DllExport int funcion(struct estructura *datos) {
struct estructura *temporal;

// Operaciones para llenar el array.
// ...

// Devolver el array, (parámetro por referencia).
memset(datos, 0, sizeof(struct estructura));
memcpy(datos, temporal, sizeof(struct estructura));
free((void *)temporal);
}



Y en C#:
// La estructura en c#
[StructLayout(LayoutKind.Sequential)]
public class est_info_prob_pal {
public char[] nombre;
public int valor;
}

// La función para usar desde C#
[DllImport(baseDir + "libreriaC.dll")]
unsafe private extern static int funcion([Out,
MarshalAs(UnmanagedType.LPStruct)] estructura datos);
public static estructura laFuncion() {
estructura datos = new estructura();
datos.nombre = new char[100];

int ret = funcion(datos);
return datos;
}


Esto produce un error de corrupción de memória al hacer la llamada a
funcion(datos) desde C#.
La idea es que desde C# pase una estructura de datos que la librería C
cambiará y los devolverá por referencia. He intentado hacer algo
parecido a lo que he hecho para pasar por referencia char*, pero no
funciona. ¿Alguien podria decirme que estoy haciendo mal?

Saludos,
Jose Luis

Preguntas similares