Parámetros por referencia de C# a C

21/12/2006 - 10:29 por moga | Informe spam
Hola,
Tengo una libreria en C que va a ser usada desde una plicación C#.

Esta librería en C tiene un método con parámetros pasados por
referéncia. Es decir, que la función actualizará los valores de esos
parámetros y esos cambios seran recogidos desde la aplicació en C#.

La librería C, (libreria.dll):
DllExport void pruebaChar(char **p_datos) {
strcpy(*p_datos, "hola");
}


Desde C# este método se usa así:

[DllImport(baseDir + "libreria.dll")]
unsafe private static extern void pruebaChar(char **p_datos);

public static string pruebaReferChar() {
unsafe {
char* pal = stackalloc char[10];

pruebaChar(&pal);
return new string(pal, 0, 10);
}
}

El caso es que, al llamar a pruebaChar(&pal) ocurre una excepción de
corrupción de memória, o bien devuelve datos inesperados.

Por favor, alguien podria orientarme sobre que hago mal?

Saludos,
Jose Luis
 

Leer las respuestas

#1 sharpman
21/12/2006 - 10:56 | Informe spam
Si estás usando VS2003, debes impedir que el CLR te cambie la dirección
física del puntero. Si la librería C la compilas con C++.Net, puedes hacer:

char __pin * dirFija = *p_datos;
strcpy(p_datos, "hola");

En otro caso puedes fijar el puntero desde C#:

fixed (char *pal = stackalloc char[10]) {
//... el codigo que llama a la funcion C
}

Si usas VS2005 tengo entendido que hay una notación mejorada
para distinguir entre punteros administrados y no administrados,
aunque aún no he necesitado probarla.
En este caso mira la documentación de C++/CLI

Saludos

Preguntas similares