2010-01-03 20 views
7

En C# PInvoke, ¿cómo paso un búfer de cadena para que el DLL de C lo rellene y lo devuelva? ¿Cuál será la declaración de PInvoke?C# PInvocar la declaración de cadenas

La declaración de la función C es

int GetData(char* data, int buflength); 

En C#, he declarado como

[DllImport(DllName)] 
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen); 

¿Es correcto? Estoy pasando la variable StringBuilder así

int bufferLength = 32; 
StringBuilder data = new StringBuilder(bufferLength); 
int result = GetData(data, bufferLength); 

Me gustaría saber si es correcto o no?

Gracias

+0

Es correcto si funciona. No hay una razón obvia de que no funcione. –

Respuesta

7

Creo que es correcto.

[DllImport(DllName)] 
static extern int GetData(StringBuilder data, int length); 

que se llama así:

StringBuilder data = new StringBuilder(32); 
GetData(data, data.Capacity); 

Una vez quería tener más control sobre los bytes devueltos por mi función y lo hizo así:

[DllImport(DllName)] 
private unsafe static bool GetData(byte* data, int length); 

utilizarse como esto :

byte[] bytes = new byte[length]; 

fixed(byte* ptr = bytes) 
{ 
    bool success = Library.GetData(ptr, length); 

    if (!success) 
    Library.GetError(); 

    return Encoding.UTF8.GetString(bytes); 
} 
3

Lo hago No creo que usar el atributo MarshalAs sea necesario aquí. StringBuilder es una opción correcta para char * out.

Supongo que será bueno agregar la propiedad CharSet ya que se trata de cadenas aquí.

De esta manera:

[DllImport(DllName, CharSet=CharSet.Auto)]