2011-03-08 4 views
7

supongamos que tengo x.dll en C++ que se parece a este¿Cómo se especifica si tomar posesión de la cadena almacenada o no?

MYDLLEXPORT 
const char* f1() 
{ 
    return "Hello"; 
} 

MYDLLEXPORT 
const char* f2() 
{ 
    char* p = new char[20]; 
    strcpy(p, "Hello"); 
    return p; 
} 

Ahora, supongamos que quiero utilizar esto en C#

[DllImport("x.dll")] 
public static extern string f1(); 

[DllImport("x.dll")] 
public static extern string f2(); 

¿Hay alguna manera de saber CLR para tener una fuerte identificación de la cadena devuelta desde f2, pero no f1? El hecho es que el hecho de que la cadena devuelta por f1 sea finalmente liberada, eliminada o lo que sea por GC es igualmente mala con el hecho de que la cadena devuelta por f2 no ​​lo hará. Espero que la pregunta sea clara. Gracias de antemano

Respuesta

4

Si tiene alguna influencia sobre la implementación dll, le sugiero que simplemente no lo haga como lo demostró en su ejemplo. De lo contrario, refina la pregunta para mencionar esa restricción.

Si tiene que devolver una cadena asignada de montón de la dll, también debe proporcionar una función de limpieza (siempre es una buena práctica al exportar memoria dinámicamente asignada desde una dll). Usted P/Invoque la función de asignación con un retorno de IntPtr y marque con uno de los Marshal.PtrToString... en http://msdn.microsoft.com/en-us/library/atxe881w.aspx y termine llamando a la función de limpieza para el lado nativo de las cosas.

Otra forma es utilizar BSTR (ejemplo de Marshaling BSTRs in COM/Interop or P/Invoke):

Nativo:

__declspec(dllexport) 
void bstrtest(BSTR *x) 
{ 
    *x = SysAllocString(L"Something"); 
} 

Gestionado:

[DllImport("mydll.dll")] 
extern static void bstrtest(ref IntPtr dummy); 

static void Main(string[] args) 
{ 
    var bstr = IntPtr.Zero; 
    bstrtest(ref bstr); 

    var text = Marshal.PtrToStringBSTR(bstr); 
    Console.WriteLine(text); 

    Marshal.FreeBSTR(bstr); 
} 

simplemente me encontré con una pregunta similar sobre SO: PInvoke for C function that returns char *

+0

Gracias. Lamento no poder haberte votado (límite diario alcanzado), ¡el enlace que proporcionaste era lo que necesitaba! –

+0

@Armen: siempre puedes volver mañana ...;) –

Cuestiones relacionadas