在 C# 中使用 C 函数
我有一个 dll,用 mingw 构建
其中一个头文件包含以下内容:
extern "C" {
int get_mac_address(char * mac); //the function returns a mac address in the char * mac
}
我在另一个 C++ 应用程序中使用此 dll,该应用程序使用 Visual C++ (2008SP1) 构建,不是托管的,而是纯 C++ (只需包含标头,然后调用函数)
但现在我必须在 C# 应用程序中使用它
问题是我无法弄清楚(我是 .net 编程新手)
这到底是怎么回事尝试
public class Hwdinfo {
[DllImport("mydll.dll")]
public static extern void get_mac_address(string s);
}
当我调用该函数时,没有任何反应
(mydll.dll 文件位于 c# 应用程序的 bin 文件夹中,并且它没有给我任何错误或警告)
i have a dll, built with mingw
one of the header files contains this:
extern "C" {
int get_mac_address(char * mac); //the function returns a mac address in the char * mac
}
I use this dll in another c++ app, built using Visual C++ (2008SP1), not managed, but plain c++
(simply include the header, and call the function)
But now I have to use it in a C# application
The problem is that i can't figure out how exactly (i'm new in .net programming)
this is what i've tried
public class Hwdinfo {
[DllImport("mydll.dll")]
public static extern void get_mac_address(string s);
}
When i call the function, nothing happens
(the mydll.dll file is located in the bin folder of the c# app, and it gives me no errors or warnings whatsoever)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我认为您需要将 extern 定义为:
您应该匹配函数上的返回参数类型 (
int
) 以及将字符串参数标记为 out 参数,以便生成 C# 代码期望从被调用函数接收一个值,而不是仅仅传入一个值。请记住,C# 中的字符串被视为不可变,这种行为也扩展到外部调用。
I think you need to define the extern as:
You should match both the return argument type on the function (
int
) as well as mark the string parameter as an out parameter so that your C# code is generated to expect to receive a value from the called function, rather than just passing one in.Remember, strings in C# are treated as immutable, this behavior extends to external calls as well.
要将字符串输出参数与 DllImport 一起使用,类型应为 StringBuilder。
这是一篇有关使用 Win32 dll 和 C# 的 MSDN 文章:
http://msdn.microsoft.com/en-us/magazine/cc164123。 ASPX
To use string output parameters with DllImport, the type should be StringBuilder.
Here's an MSDN Article about using Win32 dlls and C#:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
如果您希望 MAC 地址通过字符串参数出现,我想您最好将其作为参考。
或者类似的事情。
If you expect your MAC address to come through your string parameter, I guess you had better to make it a reference.
Or something like so.
您可以在这里找到很多示例: http://pinvoke.net/
我怀疑您会得到最好的提示来自类似: http://pinvoke.net/default.aspx/shell32.SHGetSpecialFolderPath
You can find lots of examples here: http://pinvoke.net/
I suspect that you your best hints would come from something like: http://pinvoke.net/default.aspx/shell32.SHGetSpecialFolderPath
.NET 中的字符串是不可变的,因此请尝试:
Strings in .NET are immutable so try:
C# PInvoke 输出字符串声明
这建议您可以尝试使用 StringBuilder 作为参数,而不是一个字符串。如果这不起作用,那么输出参数将是我的下一个选择。
C# PInvoke out strings declaration
This suggests you might try using a StringBuilder as your parameter instead of a string. If that doesn't work then an out parameter would be my next choice.