использование C функционирует в C#

у меня есть 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# приложения, и это не дает мне ошибок или предупреждений вообще),

5
задан Andrei S 14 May 2010 в 08:32
поделиться

6 ответов

Чтобы использовать строковые выходные параметры с 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

3
ответ дан 18 December 2019 в 08:27
поделиться

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

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

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

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

10
ответ дан 18 December 2019 в 08:27
поделиться

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

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

Или что-то в этом роде.

3
ответ дан 18 December 2019 в 08:27
поделиться

C # PInvoke объявление строк

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

1
ответ дан 18 December 2019 в 08:27
поделиться

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

Я подозреваю, что ваши лучшие подсказки могут быть получены из чего-то вроде: http://pinvoke.net/default .aspx / shell32.SHGetSpecialFolderPath

1
ответ дан 18 December 2019 в 08:27
поделиться

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

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(char[] s); 
}
1
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: