用C#调用用C++写成的dll文件时,类型的匹配
现在做一个项目,需要用到别人写好的一个dll文件中的函数,dll文件中函数的定义如下:
BOOL	HKCanInitState(
         PHKCANHANDLE mDevHandle,  
         int	    nPort,  
         UINT	    CAN_bps,
         UCHAR CAN_StationAddress,
         UCHAR CAN_Mask,  
         HANDLE	mRxEvent
         )
mDevHandle为一个结构体指针,如下:
typedef struct _HKCANHANDLE {
	HANDLE  mHandle;
	DWORD   mGuid;	
	WORD     mClass;
	WORD     mDev;
	WORD     mType;
	WORD     mState;
}HKCANHANDLE,*PHKCANHANDLE
我对函数的引用如下:
         [DllImport("HKCANDLL.dll", EntryPoint = "HKCanGetBDVersion", CallingConvention = CallingConvention.Cdecl)]
         public static extern int InitState(ref HKCANHANDLE mDevHandle, int nPort, uint CAN_bps, byte CAN_StationAddress, byte CAN_Mask, IntPtr mRxEvent);
         public struct HKCANHANDLE  
         {              
             public IntPtr mHandle;  //设备句柄   
               public UInt32 mGuid;    //设备标志  
               public UInt16 mClass;   //设备类型     
               public UInt16 mDev;     //设备数量
               public UInt16 mType;       
               public UInt16 mState;      
         }
调用如下:
IntPtr ptr = (IntPtr)null;
InitState(ref m_HKCanHandle, 0, 21295, 0, 255, ptr );
这一句执行以后,总是提示“
尝试读取或写入受保护的内存。这通常指示其他内存已损坏”,不知如何处理。
m_HKCanHandle为HKCANHANDLE 类型的变量,前面已经取得此值。
高手指点一下,困扰好几天啦,在线等。
------解决方案--------------------参考MSDN中的pinvoke,用平台调用封送数据。
平台调用是相当麻烦的事。
建议你使用c++.net混合编程来屏蔽这个细节。