Я написал простую функцию суммирования с помощью 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#.
Кто-нибудь знает, как это сделать правильно?
РЕДАКТИРОВАТЬ: я смоделировал свой класс «Class_sum» в IBM Rhapsody, который переводится как struct
в C. Фрагмент из моего 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
, что переводится как this
на языке ООП.