gpt4 book ai didi

c# - 尝试从 C Dll 调用 C# 函数

转载 作者:行者123 更新时间:2023-11-30 16:40:08 24 4
gpt4 key购买 nike

我使用 Rhapsody Developer 用 C 语言编写了一个简单的求和函数,并在我的 C 文件中将其声明为 __declspec(dllexport) int Class_Sum_sum(Class_Sum* const me, int a, int b);。我是 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 was detected

这实际上是有道理的,因为我的 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;
/*#]*/
......
......
};

Rhapsody 生成自己的函数和结构,例如 me,在 OOP 语言中翻译为 this

最佳答案

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

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

关于c# - 尝试从 C Dll 调用 C# 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com