у меня есть 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 расположен в папке мусорного ведра c# приложения, и это не дает мне ошибок или предупреждений вообще),
Чтобы использовать строковые выходные параметры с DllImport, тип должен быть StringBuilder.
public class Hwdinfo {
[DllImport("mydll.dll")]
public static extern int get_mac_address(StringBuilder s);
}
Вот статья MSDN об использовании библиотек DLL Win32 и C #:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
Я думаю, вам нужно определить extern как:
public class Hwdinfo {
[DllImport("mydll.dll")]
public static extern int get_mac_address(out string s);
}
Вы должны соответствовать как типу возвращаемого аргумента функции (int
), так и отметить строковый параметр как параметр out, чтобы ваш код C# был сгенерирован так, чтобы ожидать получения значения от вызываемой функции, а не просто передавать его.
Помните, что строки в C# считаются неизменяемыми, это поведение распространяется и на внешние вызовы.
Если вы ожидаете, что ваш MAC-адрес будет передаваться через строковый параметр, я думаю, вам лучше сделать его ссылкой.
public class Hwdinfo {
[DllImport("mydll.dll")]
public static extern int get_mac_address(out string s);
}
Или что-то в этом роде.
Это предполагает, что вы можете попробовать использовать StringBuilder в качестве параметра вместо строки. Если это не сработает, моим следующим выбором будет параметр out.
Вы можете найти множество примеров здесь: http://pinvoke.net/
Я подозреваю, что ваши лучшие подсказки могут быть получены из чего-то вроде: http://pinvoke.net/default .aspx / shell32.SHGetSpecialFolderPath
Строки в .NET неизменяемы, поэтому попробуйте:
public class Hwdinfo {
[DllImport("mydll.dll")]
public static extern int get_mac_address(char[] s);
}