情况是这样的,我买了一块插在电脑上的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”。要终止程序,请单击“确定””这样的错误。这是怎么回事呢?

解决方案 »

  1.   

    怎么两个函数的参数个数都不相同,你难道在net这边有重写封装了?
    HSCAN_InitCANDevice  与 HSCAN_OpenCANDevice,函数不一样?
      

  2.   

    晕,刚才发错函数原型了,DLL里面定义如下:
    extern "C" int _stdcall HSCAN_OpenCANDevice(HWND hWnd,UINT nMsg);
      

  3.   

    [DllImport("HS2102API.DLL",
    CallingConvention=CallingConvention.Cdecl,
     CharSet = CharSet.Ansi
    )]
      public static extern int HSCAN_OpenCANDevice(IntPtr hWnd, UInt32 nMsg);
      

  4.   

    好像不是这个问题,这个DLL中还有其他函数,我用其他不带句柄操作的函数测试了一下,还是有类似错误。
      

  5.   

    用depend看下,是不是缺少什么依赖文件
      

  6.   

    估计是内存释放的问题,你仔细检查,有没有非托管内存分配,用Marshal释放,
    或在C++那边写正确的释放函数:new -》delete ;malloc-》free,C#这边调用。
      

  7.   


    函数原型里都申明了是stdcall压栈方式,这里自然要用stdcall而不是Cdecl
      

  8.   

    给个例子看看吧
     [DllImport(@"D:\workspace\Projects\QD\Debug\QD.dll", EntryPoint = "Q2D", CallingConvention = CallingConvention.Cdecl)]
    public static extern int* Q2D(double* p, int n);