.net pinvoke marshalling

.net - Marshal "char*" en C#



pinvoke marshalling (2)

Dada la siguiente función C en un archivo DLL:

char * GetDir(char* path );

¿Cómo P / Invocaría esta función en C # y ordenaría la char * apropiadamente? .NET parece saber cómo hacer LPCTSTR, pero cuando no puedo encontrar ninguna ordenación que no provoque que una NotSupportedException se active al llamar a esta función.


La respuesta de OregonGhost solo es correcta si el char * devuelto por GetDir está asignado en HGlobal o LocalAlloc. No recuerdo 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 sólida es escribir el retorno de GetDir para que sea IntPtr. Luego puede usar cualquiera de las funciones de 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 otras pistas sobre el comportamiento de GetDir? ¿Modifica la cadena de entrada? ¿Cómo se asigna el valor que se devuelve? Si puede proporcionar, puedo dar una respuesta mucho mejor.


Tratar

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

la cadena se asigna automáticamente a 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 .