你好,社区我自己学习编程,并陷入了使用dll的困境。
遇到错误:
C:
#include <stdio.h>
const char *print(const char *message)
{
if (message != 0) {
const char *message1 = "Connected";
return message1;
message = "";
}
return "Message empty";
}
C#:
public partial class Form1 : Form
{
/*Declaration*/
bool T;
string a;
[DllImport("DLLC.dll")]
static extern string print(string message);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
a = print("Send");
if (T)
{
label1.Text = a ;
T=false;
}
else{
label1.Text = "BAD";
T=true;
}
}
}
发短信,因为堆栈溢出使代码无法发布:
想法是学习如何在c#中使用c函数。
我还想将open62541库用于OPC UA SERVER并使用Windows窗体制作UI。
在互联网上,没有足够的可理解信息来说明如何制作包装器和其他程序... YouTube上没有任何有关此的视频。
答案 0 :(得分:4)
您需要将DLL中的功能标记为已导出。有两种方法可以做到这一点。您可以创建一个.def
文件并命名导出的函数,也可以在函数签名中添加说明符__declspec(dllexport)
。
要创建.def
文件,请在Visual Studio中打开C DLL项目,右键单击“源文件”,然后在“ Visual C ++”->“代码”下,选择“模块定义文件( .def)”。在新创建的.def
文件中,您可以列出要导出的函数,如下所示:
LIBRARY mydll
EXPORTS
function1
function2
function3
然后,当您构建DLL时,function1
,function2
和function3
可用。
此外,请记住,除非您手动指定调用约定(例如int __stdcall function1(int a, int b);
),否则默认情况下,调用约定为__cdecl
,因此,当您添加行以通过P导入函数时/调用,您还必须具有属性CallingConvention = CallingConvention.CDecl
。不符合调用约定将导致调用代码中的堆栈损坏。