我在C中使用Rhapsody Developer编写了一个简单的求和函数,并在我的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
这实际上是有道理的,因为我的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
。
答案 0 :(得分:0)
你必须放第三个参数,因为它是C#中的指针,你必须使用单词ref
public static extern int Class_Sum_sum(ref Class_Sum parameterName,int a, int b)