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

C# 如何在C中正确使用C Dll,c#,c,dll,pinvoke,C#,C,Dll,Pinvoke,社区你好,我正在自学编程,并坚持使用dll 获取错误: C: 由于堆栈溢出而不允许仅发布代码而发送文本: 其思想是学习如何在c中使用c中的函数 此外,我想使用OPC UA服务器的open62541库,并使用windows窗体创建UI 在互联网上没有足够易懂的信息如何制作包装器和其他程序。。。YouTube上没有任何关于此的视频。您需要将DLL中的函数标记为已导出。有两种方法可以做到这一点。您可以创建一个.def文件并命名导出的函数,或者将说明符uu declspecdllexport添加到函数签

社区你好,我正在自学编程,并坚持使用dll

获取错误:

C:

由于堆栈溢出而不允许仅发布代码而发送文本:

其思想是学习如何在c中使用c中的函数

此外,我想使用OPC UA服务器的open62541库,并使用windows窗体创建UI


在互联网上没有足够易懂的信息如何制作包装器和其他程序。。。YouTube上没有任何关于此的视频。

您需要将DLL中的函数标记为已导出。有两种方法可以做到这一点。您可以创建一个.def文件并命名导出的函数,或者将说明符uu declspecdllexport添加到函数签名中

< P>创建.DEF文件,在VisualStudio中打开C DLL项目,右击源文件,然后在VisualC++ ++代码下,选择模块定义文件。在新创建的.def文件中,可以列出要导出的函数,如下所示:

LIBRARY mydll
EXPORTS
    function1
    function2
    function3
然后,在构建DLL时,function1、function2和function3可用


另外,请记住,除非手动指定调用约定,例如int\u stdcall function1int a、int b;,默认情况下,调用约定是_cdecl,因此当您添加行以通过P/Invoke导入函数时,还必须具有CallingConvention=CallingConvention.cdecl属性。未能匹配调用约定将导致调用代码中的堆栈损坏。

您需要导出打印函数\uu declspecdlimport。还要注意你的调用约定。另外,由于消息是可以更改的,尽管你从来没有这样做过,你需要从C端将它作为ref传递进来。你能解释一下你的意思吗?因为我对这真的很陌生…代码不会像现在这样工作。在c语言中,字符串是以“\0”结尾的字节数组。在c语言中,字符串是一个两字节的对象。所以您必须这样转换:Encoding.UTF8.GetBytesSend\0您还需要更改定义:静态外部字节[]打印字节[]消息@jdweng marshaling会处理这个。。。
     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;
             }

         }
     }
LIBRARY mydll
EXPORTS
    function1
    function2
    function3