C# 在C语言中使用C函数#

C# 在C语言中使用C函数#,c#,c,dll,unmanaged,dllimport,C#,C,Dll,Unmanaged,Dllimport,我有一个dll,是用mingw构建的 其中一个头文件包含以下内容: extern "C" { int get_mac_address(char * mac); //the function returns a mac address in the char * mac } 我在另一个C++应用程序中使用这个DLL,使用Visual C++(No.88SP1)构建,未管理,但纯C++ (只需包含标题并调用函数) 但现在我不得不在C#应用程序中使用它 问题是我不知道具体是怎么回事(我是.net

我有一个dll,是用mingw构建的
其中一个头文件包含以下内容:

extern "C" {
  int get_mac_address(char * mac); //the function returns a mac address in the char * mac
}
我在另一个C++应用程序中使用这个DLL,使用Visual C++(No.88SP1)构建,未管理,但纯C++ (只需包含标题并调用函数)

但现在我不得不在C#应用程序中使用它

问题是我不知道具体是怎么回事(我是.net编程新手)

这就是我尝试过的

public class Hwdinfo {
    [DllImport("mydll.dll")]
    public static extern void get_mac_address(string s);
}
当我调用这个函数时,什么都没有发生


(mydll.dll文件位于c#app的bin文件夹中,它不会给我任何错误或警告)

我认为您需要将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); 
} 

或者类似的东西。

你可以在这里找到很多例子:


我想您最好的提示可能来自这样的内容:

在.NET中字符串是不可变的,所以请尝试:

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


这建议您可以尝试使用StringBuilder作为参数,而不是字符串。如果这不起作用,那么输出参数将是我的下一个选择。

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


public class Hwdinfo {
    [DllImport("mydll.dll")]
    public static extern int get_mac_address(StringBuilder s);
}
下面是一篇关于使用Win32 DLL和C#的MSDN文章:

您希望发生什么?你什么也不退。如果您希望返回参数,则可能需要将其作为ref string s或out string s传递。我认为相同。=)该死快40秒!呵呵。。。当您的答案出现时,我正在单击“发布答案!”=)我知道,我在写答案之前写了太多了=P@Will马奎勒:有时候,谁先看到并回答一个问题只是抽签的运气。当然!毕竟,我是在开玩笑!=)无论如何呵呵。。。祝您有个美好的一天!NET封送员可以使用StringBuilder处理此问题,如公认的答案所示