Pregunta

Dada la siguiente función C en un DLL:

char * GetDir(char* path );

¿Cómo P / Invoquaría esta función en C # y formaría el char * correctamente? .NET parece saber cómo hacer LPCTSTR, pero cuando no puedo encontrar ningún cálculo de referencias que no haga que se active una excepción NotSupportedException al llamar a esta función.

¿Fue útil?

Solución

La respuesta de OregonGhost solo es correcta si el char * devuelto por GetDir se asigna en HGlobal o LocalAlloc. No puedo recordar cuál, pero el CLR asumirá que cualquier tipo de retorno de cadena de una función PInvoke fue asignado con uno u otro.

Una forma más robusta es escribir el retorno de GetDir para que sea IntPtr. Luego puede usar cualquiera de las funciones Marshal.PtrToStringAnsi para obtener un tipo de cadena. También le brinda la flexibilidad de liberar la cuerda de la manera que elija.


[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);

¿Puede darnos otros consejos sobre el comportamiento de GetDir? ¿Modifica la cadena de entrada? ¿Cómo se asigna el valor que se devuelve? Si puede proporcionar que puedo dar una respuesta mucho mejor.

Otros consejos

Probar

[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);
La cadena

se convierte automáticamente en una cadena terminada en cero, y con la propiedad CharSet, le dice al Marshaller que debe usar ANSI en lugar de Unicode. Nota: use string (o System.String) para un const char *, pero StringBuilder para un char *.

También puedes probar MarshalAs, como en este ejemplo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top