2010-05-13 22 views
5

ho una dll, costruito con MinGW
uno dei file di intestazione contiene questo:utilizzando la funzione C in C#

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

Io uso questa dll in un altro C++ app, costruito utilizzando Visual C++ (2008SP1), non è riuscito, ma c pianura ++ (semplicemente include l'intestazione, e chiamare la funzione)

ma ora devo usarlo in un'applicazione C#

il problema è che non riesco a capire come esattamente (sono nuovo nella programmazione .net)

questo è quello che ho provato

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

quando chiamo la funzione, non succede nulla

(il file mydll.dll si trova nella cartella bin del C# app, e dà mE Nessun errore o avviso di sorta)

+1

Cosa si aspetta che accada? Non stai restituendo nulla. Se si desidera ripristinare il parametro, potrebbe essere necessario passarlo come stringa di riferimento o stringa esterna. – Stephan

+2

Perché questo tag è C++? –

+0

sry, ho modificato in C –

risposta

3

Per utilizzare i parametri di output della stringa con DllImport, il tipo deve essere StringBuilder.


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

Ecco un articolo di MSDN su come utilizzare le DLL Win32 e C#:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

+0

provato e ha funzionato grazie per le informazioni! –

10

penso che è necessario definire l'extern come:

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

Dovresti abbinare sia il tipo di argomento di ritorno sulla funzione (int) sia contrassegnare il parametro stringa come parametro out in modo che il tuo codice C# venga generato per aspettarsi di ricevere un valore dalla funzione chiamata, piuttosto che passarne uno solo in

Ricordare che le stringhe in C# sono considerate immutabili, questo comportamento si estende anche alle chiamate esterne.

+0

+1 penso lo stesso. =) Accidenti! 40 secondi più veloce! Hehehe ... Stavo cliccando "Rispondi alla risposta" quando è arrivata la tua risposta! =) Lo so, ho scritto troppo prima di scrivere la mia risposta! = P –

+0

@Will Marcouiller: A volte è solo la fortuna del sorteggio su chi vede e risponde a una domanda prima. – LBushkin

+0

Sicuro! Stavo cercando di scherzare, dopo tutto! =) Comunque! Hehehe ... Buona giornata! –

3

Se si prevede che il proprio indirizzo MAC passi attraverso il proprio parametro di stringa, credo che sia meglio farne un riferimento.

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

Oppure qualcosa del genere.

1

stringhe in .NET sono immutabili in modo da provare:

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

.NET Marshaller può gestire questo con StringBuilder, come nella risposta accettata – Sebastian

1

C# PInvoke out strings declaration

Ciò suggerisce che si potrebbe provare a utilizzare un oggetto StringBuilder come parametro anziché come Tring. Se ciò non funziona, un parametro out sarebbe la mia prossima scelta.

+0

grazie per il collegamento! –