情况是这样的,我买了一块插在电脑上的CAN卡,想用C#做一个上位机程序,厂家提供了一个DLL,里面有个函数声明如下:
extern "C" void _stdcall HSCAN_InitCANDevice(unsigned char nDevice,unsigned char nPort,HSCAN_INIT *pInit);
在C#中我是这样声明的
[DllImport("HS2102API.DLL", CharSet = CharSet.Auto)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
调用如下:
int g_iDeviceNum = HS2102CANAPI.HSCAN_OpenCANDevice(this.Handle,HS2102CANAPI.USER);//其中HS2102CANAPI.USER=0x5001
调试时出现了以下情况,F5运行没有问题,但关闭此调试窗体时,总是会出现“指令引用的***内存。该内存不能为“read”。要终止程序,请单击“确定””这样的错误。这是怎么回事呢?
extern "C" void _stdcall HSCAN_InitCANDevice(unsigned char nDevice,unsigned char nPort,HSCAN_INIT *pInit);
在C#中我是这样声明的
[DllImport("HS2102API.DLL", CharSet = CharSet.Auto)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
调用如下:
int g_iDeviceNum = HS2102CANAPI.HSCAN_OpenCANDevice(this.Handle,HS2102CANAPI.USER);//其中HS2102CANAPI.USER=0x5001
调试时出现了以下情况,F5运行没有问题,但关闭此调试窗体时,总是会出现“指令引用的***内存。该内存不能为“read”。要终止程序,请单击“确定””这样的错误。这是怎么回事呢?
HSCAN_InitCANDevice 与 HSCAN_OpenCANDevice,函数不一样?
extern "C" int _stdcall HSCAN_OpenCANDevice(HWND hWnd,UINT nMsg);
CallingConvention=CallingConvention.Cdecl,
CharSet = CharSet.Ansi)]
public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
或在C++那边写正确的释放函数:new -》delete ;malloc-》free,C#这边调用。
函数原型里都申明了是stdcall压栈方式,这里自然要用stdcall而不是Cdecl
[DllImport(@"D:\workspace\Projects\QD\Debug\QD.dll", EntryPoint = "Q2D", CallingConvention = CallingConvention.Cdecl)]
public static extern int* Q2D(double* p, int n);