日期:2014-05-17  浏览次数:21078 次

C#获取委托的函数指针
本帖最后由 yunluozhi 于 2012-07-09 13:17:42 编辑
//全局静态委托
private static HuaMeiSiFangSdk.Delegate_ITS_Dev_Func_CallBack delegate_ITS_Dev_Func_CallBack = null;

//ITS_Dev_Func_CallBack为回调函数
delegate_ITS_Dev_Func_CallBack = new HuaMeiSiFangSdk.Delegate_ITS_Dev_Func_CallBack(ITS_Dev_Func_CallBack);

IntPtr ptr = Marshal.GetFunctionPointerForDelegate(delegate_ITS_Dev_Func_CallBack);
long addr = (long)ptr.ToInt32();

//注册设备
g_Dev_Handle = ITS_T_DEV_Reg(ref m_Ftp_Para, addr, LongObject);

ITS_T_DEV_Start(g_Dev_Handle);

以上程序段为C#接C的SDK代码,

全部执行完后报值为空,回调函数中所有代码都屏蔽,但不知道值为空究竟从何而来(捕捉不到),

怀疑和委托有关系,请指教




------解决方案--------------------
addr不要转为long,ITS_T_DEV_Reg的第二个参数应该为Int32。
因为C语言的long类型实际上是32位,对应Int32,强制转为long的结果是C实际接收到为NULL的函数指针
------解决方案--------------------
这个错误还真是少见,错误的范围又太广
先改一下这试试:public static HuaMeiSiFangSdk.Delegate_ITS_Dev_Func_CallBack delegate_ITS_Dev_Func_CallBack = null;
如果不行的话
ITS_T_DEV_Reg的第二个参数直接声明为Delegate_ITS_Dev_Func_CallBack,不再调用GetFunctionPointerForDelegate,直接传入delegate_ITS_Dev_Func_CallBack
------解决方案--------------------
试下在HuaMeiSiFangSdk中,Delegate_ITS_Dev_Func_CallBack的定义前加上:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

另外直接传入委托按理也应该是可以的,这个倒不一定要改,但楼主可以试试

指针在C#中声明为IntPtr是通行的做法,这通常不会造成错误,转化的话就用Marshal类中的方法即可
------解决方案--------------------
因为C中的默认函数调用约定是cdecl,而如果要声明回调函数的话,更改其调用约定为CALLBACK或stdcall是更为标准的做法,但显然你的dll并没有这么做
因为C#中的默认外部函数调用约定是stdcall,这样就造成了函数调用约定不匹配。因此,在C#的委托定义前加上UnmanagedFunctionPointer,以指示封送服务应该将C#函数委托作为cdecl函数指针进行转化,而非默认的stdcall