在 C# 中使用 C 函数

发布于 2024-09-01 13:50:37 字数 567 浏览 11 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

铁憨憨 2024-09-08 13:50:37

我认为您需要将 extern 定义为:

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

您应该匹配函数上的返回参数类型 (int) 以及将字符串参数标记为 out 参数,以便生成 C# 代码期望从被调用函数接收一个值,而不是仅仅传入一个值。

请记住,C# 中的字符串被视为不可变,这种行为也扩展到外部调用。

I think you need to define the extern as:

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

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.

梦明 2024-09-08 13:50:37

要将字符串输出参数与 DllImport 一起使用,类型应为 StringBuilder。


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

这是一篇有关使用 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.


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

Here's an MSDN Article about using Win32 dlls and C#:
http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

与风相奔跑 2024-09-08 13:50:37

如果您希望 MAC 地址通过字符串参数出现,我想您最好将其作为参考。

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

或者类似的事情。

If you expect your MAC address to come through your string parameter, I guess you had better to make it a reference.

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

Or something like so.

乖乖兔^ω^ 2024-09-08 13:50:37

您可以在这里找到很多示例: 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

长伴 2024-09-08 13:50:37

.NET 中的字符串是不可变的,因此请尝试:

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

Strings in .NET are immutable so try:

public class Hwdinfo { 
    [DllImport("mydll.dll")] 
    public static extern int get_mac_address(char[] s); 
}
江南烟雨〆相思醉 2024-09-08 13:50:37

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文