2010-05-13 10 views
5

Tengo un DLL, construido con MinGW
uno de los archivos de cabecera contiene esto:utilizando la función de C en C#

extern "C" { 
    int get_mac_address(char * mac); //the function returns a mac address in the char * mac 
} 

utilizo este DLL en otro ++ aplicación c, construido utilizando Visual C++ (2008SP1), no logró, pero c llanura ++ (basta con incluir la cabecera, y llamar a la función)

pero ahora tengo que usarlo en una aplicación C#

el problema es que no puedo encontrar la manera exactamente (soy nuevo en la programación .net)

esto es lo que he intentado

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern void get_mac_address(string s); 
} 

cuando llame a la función, no pasa nada

(el archivo mydll.dll se encuentra en la carpeta bin de la aplicación de C#, y da me no hay errores o advertencias de ningún tipo)

+1

¿Qué espera que suceda? No estás devolviendo nada. Si quiere recuperar el parámetro, puede que tenga que pasarlo como ref string s o out string s. – Stephan

+2

¿Por qué está etiquetado C++? –

+0

sry, edité a C –

Respuesta

3

Para usar los parámetros de salida de cadena con DllImport, el tipo debe ser StringBuilder.


public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(StringBuilder s); 
} 

He aquí un artículo de MSDN sobre el uso de archivos DLL Win32 y C#:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

+0

intenté esto y funcionó ¡gracias por la información! –

10

creo que es necesario definir el extern como:

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(out string s); 
} 

Debe coincidir tanto con el tipo de argumento de retorno en la función (int) como marcar el parámetro de cadena como un parámetro de salida para que su código C# se genere esperando recibir un valor de la función llamada, en lugar de simplemente pasar uno

Recuerde, las cadenas en C# se tratan como inmutables, este comportamiento se extiende también a las llamadas externas.

+0

+1 Creo lo mismo. =) ¡Maldición! 40 segundos más rápido! Hehehe ... Estaba haciendo clic en "Responder mensaje" cuando recibí tu respuesta. =) Lo sé, ¡escribí demasiado antes de escribir mi respuesta! = P –

+0

@Will Marcouiller: A veces es solo la suerte del sorteo quién ve y responde una pregunta primero. – LBushkin

+0

¡Claro! ¡Estaba tratando de estar bromeando, después de todo! =) De todos modos! Hehehe ... ¡Que tengas un buen día! –

3

Si espera que su dirección MAC pase a través de su parámetro de cadena, supongo que es mejor que lo haga una referencia.

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(out string s); 
} 

O algo así.

1

cadenas en .NET son inmutables a fin de tratar:

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(char[] s); 
} 
+0

.NET Marshaller puede manejar esto usando StringBuilder, como en la respuesta aceptada – Sebastian

1

C# PInvoke out strings declaration

Esto sugiere que podría intentar usar un StringBuilder como su parámetro en lugar de como tring. Si eso no funciona, entonces un parámetro de salida sería mi próxima opción.

+0

¡gracias por el enlace! –