используя функцию C в C # - PullRequest
5 голосов
/ 13 мая 2010

У меня есть DLL, построенный с Mingw
один из заголовочных файлов содержит это:

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

Я использую эту DLL в другом приложении C ++, построенном с использованием Visual C ++ (2008SP1), не управляемым, но простым C ++ (просто включите заголовок и вызовите функцию)

Но теперь я должен использовать его в приложении на C #

Проблема в том, что я не могу понять, как именно (я новичок в программировании .net)

это то, что я пробовал

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

Когда я вызываю функцию, ничего не происходит

(файл mydll.dll находится в папке bin приложения c # и не дает никаких ошибок или предупреждений)

Ответы [ 6 ]

10 голосов
/ 13 мая 2010

Я думаю, вам нужно определить внешний вид как:

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

Вы должны соответствовать как типу возвращаемого аргумента функции (int), так и пометить строковый параметр как выходной параметр, чтобы ваш код C # генерировался так, чтобы ожидать получения значения от вызываемой функции, а не просто проходя один дюйм.

Помните, что строки в C # обрабатываются как неизменяемые, это поведение распространяется и на внешние вызовы.

3 голосов
/ 13 мая 2010

Чтобы использовать строковые выходные параметры с DllImport, тип должен быть StringBuilder.


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

Вот статья MSDN об использовании Win32 dll и C #:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

3 голосов
/ 13 мая 2010

Если вы ожидаете, что ваш MAC-адрес будет проходить через строковый параметр, я думаю, вам лучше сделать его ссылкой.

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

Или как-то так.

1 голос
/ 13 мая 2010

C # PВозвать строку декларации

Это говорит о том, что вы можете попробовать использовать StringBuilder в качестве параметра вместо строки. Если это не сработает, то моим следующим выбором будет параметр out.

1 голос
/ 13 мая 2010

Строки в .NET неизменны, поэтому попробуйте:

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(char[] s); 
}
1 голос
/ 13 мая 2010

Здесь вы можете найти множество примеров: http://pinvoke.net/

Я подозреваю, что ваши лучшие намеки были бы получены от чего-то вроде:

...