如何在C#中正确使用C Dll

时间:2019-03-14 13:51:20

标签: c# c dll pinvoke

你好,社区我自己学习编程,并陷入了使用dll的困境。

遇到错误:

enter image description here

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上没有任何有关此的视频。

1 个答案:

答案 0 :(得分:4)

您需要将DLL中的功能标记为已导出。有两种方法可以做到这一点。您可以创建一个.def文件并命名导出的函数,也可以在函数签名中添加说明符__declspec(dllexport)

要创建.def文件,请在Visual Studio中打开C DLL项目,右键单击“源文件”,然后在“ Visual C ++”->“代码”下,选择“模块定义文件( .def)”。在新创建的.def文件中,您可以列出要导出的函数,如下所示:

LIBRARY mydll
EXPORTS
    function1
    function2
    function3

然后,当您构建DLL时,function1function2function3可用。

此外,请记住,除非您手动指定调用约定(例如int __stdcall function1(int a, int b);),否则默认情况下,调用约定为__cdecl,因此,当您添加行以通过P导入函数时/调用,您还必须具有属性CallingConvention = CallingConvention.CDecl。不符合调用约定将导致调用代码中的堆栈损坏。