繁体   English   中英

尝试从C Dll调用C#中的函数

[英]Attempt to call a function in C# from a C Dll

我使用Rhapsody Developer在C语言中编写了一个简单的sum函数,并将其声明为__declspec(dllexport) int Class_Sum_sum(Class_Sum* const me, int a, int b); 在我的C文件中。 我是C#编程的初学者。

我的C#程序如下所示:

using System.Runtime.InteropServices;


namespace Test1_C_Sharp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int x = Win32.Class_Sum_sum(5, 8);
            textBox1.Text = x.ToString();
        }
    }

    public class Win32
    {
        [DllImport("CalcSum.dll", CharSet = CharSet.Auto)]
        public static extern int Class_Sum_sum(int a, int b);

    }

}

当我执行此代码时,按预期方式,我将获得一个带有文本框和“求和”按钮的窗体,当我按“求和”按钮时,会抛出一个异常,说

检测到PInvokeStackImbalance

这实际上是有道理的,因为我在C函数中有三个参数(Class_sum *,int,int),而且我不知道C#代码中的第一个参数应该是什么样子。

有人知道这样做的正确方法吗?

编辑:我在IBM Rhapsody中为类“ Class_sum”建模,该类将转换为C中的struct 。H文件的片段如下所示:

/*## class Class_Sum */
typedef struct Class_Sum Class_Sum;
struct Class_Sum {
    RiCReactive ric_reactive;
    int op1;        /*## attribute op1 */
    int op2;        /*## attribute op2 */
    int sum;        /*## attribute sum */
    /*#[ ignore */
    int rootState_subState;
    int rootState_active;
    int MainState_subState;
    /*#]*/ 
  ......
  ......
};

狂想曲生成自己的功能和结构像me举例来说,转化为this在OOP语言。

您必须放置第三个参数,因为它是C#中的指针,所以必须使用单词ref

public static extern int Class_Sum_sum(ref Class_Sum parameterName,int a, int b)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM