【发布时间】:2015-09-08 05:34:38
【问题描述】:
例外情况:
托管调试助手“PInvokeStackImbalance”在“D:\UI_still_in_progress\user_interface\bin\Debug\WindowsFormsApplication1.vshost.exe”中检测到问题。
基本上,我的应用程序在 C++ 中有一个后台实时进程,它与微处理器通信。我已经设置了一个 c++ dll 文件,它允许我从 c++ 应用程序和 c# UI 实时传递数据。
我的问题是,我必须创建一个有限状态机,以确保物理设备和 c++ 应用程序都在根据 UI 中发生的事情做他们应该做的事情。所以我的目标是将代表状态的简单整数从 c# 传递到 c++。
实时数据从 c++ 传递到 c#,使用以下实现没有问题:
c++ .h 文件 sn-p:
extern "C" __declspec (dllexport) int grabx();
extern "C" __declspec (dllexport) void setFSMstate(int s);
C++ .cpp 文件 sn-p:
int grabx()
{
return x0;
}
void setFSMstate(int s)
{
state = s;
}
c# 类
public class MyDllMethods {
[DllImport("dllTESTER.dll")]
public static extern int grabx();
[DllImport("dllTESTER.dll")]
public static extern void setFSMstate(int s);
}
c# 方法调用
xx = MyDllMethods.grabx();
MyDllMethods.setFSMstate(2);
grabx() 函数工作正常,我可以实时读取设备中的 x 值。当我的 UI 移动到新屏幕时,我尝试通过将 2 传递给 setFSMstate() 来更改每个应用程序中的状态。调用此方法时会引发异常。
我对 P/Invoke 还是很陌生,所以如果我遗漏了什么,请帮忙。我可能编组错了,但我确信 int 类型在 c# 和 c++ 中是相同的?
【问题讨论】:
标签: c# c++ pinvoke marshalling dllimport