2009-02-03 3 views
7

Dada esta declaración C API, ¿cómo se importaría a C#?Cómo importar la API de const char * a C#?

const char* _stdcall z4LLkGetKeySTD(void); 

que he podido llegar hasta aquí:

[DllImport("zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4LLkGetKeySTD", 
     ExactSpelling = false)] 
    private extern static const char* z4LLkGetKeySTD(); 

Respuesta

12

probar este

[DllImport("zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4LLkGetKeySTD", 
     ExactSpelling = false)] 
    private extern static IntPtr z4LLkGetKeySTD(); 

A continuación, puede convertir el resultado en una cadena mediante el uso de Marshal.PtrToStringAnsi(). Aún necesitará liberar la memoria para el IntPtr usando el método apropiado Marshal.Free *.

+0

¿Cómo se sabe qué método Marshal.Free * se debe utilizar? –

+0

@thelaughingdm, depende de cómo se asignó la memoria. El Marshal.FreeCoTaskMemAlloc libera un CoTaskMemAlloc nativo. Cada uno trabaja con un método nativo particular – JaredPar

2

sólo tiene que utilizar 'cadena' en lugar de 'const char *'.

Editar: Esto es peligroso por la razón que explicó JaredPar. Si no quieres una gratis, no uses este método.

+0

¡Sacaste las palabras de mi boca! – leppie

+0

Definitivamente no use String. Si el retorno de una función es un String, el CLR intentará CoTaskMemFree el puntero nativo que probablemente no es lo que el usuario quiere aquí – JaredPar

+1

http://msdn.microsoft.com/en-us/magazine/cc164193.aspx parte inferior de la paragrah bajo la figura 8 – JaredPar

4

Utilice siempre C++ const char * o char * y not std :: string.

También tenga en cuenta que el carácter en C++ es un sbyte en C# y el carácter sin signo es un byte en C#.

Es aconsejable utilizar un código no seguro cuando se trata de DllImport.

[DllImport("zip4_w32.dll", 
    CallingConvention = CallingConvention.StdCall, 
    EntryPoint = "z4LLkGetKeySTD", 
    ExactSpelling = false)] 
private extern static sbyte* or byte* z4LLkGetKeySTD(); 

void foo() 
{ 
    string res = new string(z4LLkGetKeySTD()); 
} 
Cuestiones relacionadas