usar punteros operaciones leer funciones con como caracteres cadenas cadena arreglo c# .net dll pinvoke marshalling

punteros - ¿Cómo paso un const char*a una función C desde C#?



punteros a cadenas (2)

Un const char* es simplemente una string en .NET - el lado administrado no (todavía) entiende la noción de parámetros de solo lectura.

Si está utilizando esto en un contexto de P / Invocar, debe declarar un atributo de MarshalAs y LPStr como LPStr . La firma resultante se vería algo en la línea de

[DllImport("SomeModule.dll")] public static extern void set_param([MarshalAs(UnmanagedType.LPStr)]string lpString);

También hay este artículo en MSDN con más información sobre cómo ordenar cadenas nativas en un entorno administrado.

Intento llamar a una función C simple desde un DLL externo fuera de mi aplicación C #. Esta función se define como

void set_param(const char *data)

Ahora tengo algunos problemas al usar esta función:

  1. ¿Cómo especifico esta "const" en C-code? public static extern void set_param(sbyte *data) parece perderse la parte "const".

  2. ¿Cómo entrego una cadena C de 8 bits cuando llamo a esta función? Una llamada a set_param("127.0.0.1") da como resultado un mensaje de error, "no se puede convertir de ''cadena'' a ''sbyte ''" *.


Parece que va a utilizar el conjunto de caracteres ANSI, por lo que podría declarar la P / invocación así:

[DllImport("yourdll.dll", CharSet = CharSet.Ansi)] public static extern void set_param([MarshalAs(UnmanagedType.LPStr)] string lpString);

El. Marshaller de .NET maneja hacer copias de cadenas y convertir los datos al tipo correcto para usted.

Si tiene un error con una pila desbalanceada, necesitará establecer la convención de llamadas para que coincida con su DLL de C, por ejemplo:

[DllImport("yourdll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]

Consulte pinvoke.net para obtener muchos ejemplos con las funciones de la API de Windows.

También vea la documentación de Microsoft sobre las cadenas pinvoking .