问题描述
有没有精通C++和C#的大侠:我想用C#调用C++的DLL的一个接口,但实在不会C++转C#请教:C++接口如下:函数:int32_tDPSDK_CALL_METHODDPSDK_QueryAlarmInfo(INint32_tnPDLLHandle,INAlarm_Query_Info_t*pQuery,INOUTAlarm_Info_t*pInfo,INintnFirstNum,INintnQueryCount,INintnTimeout=DPSDK_CORE_DEFAULT_TIMEOUT);参数:nPDLLHandle[in]sdk实例句柄pQuery[in]查询信息,参考表1pInfo[in,out]报警信息,参考表4nFirstNum[in]从第几个开始获取nQueryCount[in]获取记录个数nTimeout[in]超时,默认DPSDK_CORE_DEFAULT_TIMEOUT对象如下:typedefstructtagAlarmQueryInfo{charszCameraID[DPSDK_CORE_CHL_ID_LEN];//通道IDuint64_tuStartTime;//开始时间uint64_tuEndTime;//结束时间dpsdk_alarm_dealwith_enDealWith;//报警处理类型,参考表2dpsdk_alarm_type_enAlarmType;//报警类型,参考表3}Alarm_Query_Info_t;typedefstructtagAlarmInfo{INuint32_tnCount;//请求录像数OUTuint32_tnRetCount;//实际返回个数OUTSingle_Alarm_Info_t*pAlarmInfo;//报警信息,参考表5}Alarm_Info_t;typedefstructtagSingleAlarmInfo{dpsdk_alarm_type_enAlarmType;//报警类型,参考表3dpsdk_event_type_enEventType;//事件状态,参考表6charszDevId[DPSDK_CORE_DEV_ID_LEN];//报警设备IDuint32_tuChannel;//报警通道uint64_tuAlarmTime;//报警时间dpsdk_alarm_dealwith_enDealWith;//处理意见,参考表2}Single_Alarm_Info_t;请问C#调用这个接口该怎么写?更多0
解决方案
解决方案二:
不要做A语言代码修改为B语言代码的无用功。也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。即可很方便地让A、B两种语言之间协调工作。比如:A将请求数据写到文件a.txt,写完后改名为aa.txtB发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txtA发现bb.txt存在时,读取其内容,读完后删除bb.txt以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。除非A或B不支持判断文件是否存在、文件读写和文件更名。但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?可以将临时文件放在RamDisk上提高效率减少磨损磁盘。数据的结构很复杂的话,文本文件的格式问题可参考json或xml共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:·进程之间松耦合·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。·方便在线开关服务,只需删除或创建该临时文本文件即可。·方便实现分布式和负载均衡。·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)·……“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,回头是“使用共享纯文本文件进行信息交流”的岸!
解决方案三:
http://blog.csdn.net/jiangxinyu/article/details/7848015[DllImport(“MyDLL.dll")]publicstaticexternintmySum(inta,intb);注意C++函数的参数转换成C#的时候要对应usignedchar-byteint*int[]usignedchar*-byte[]
解决方案四:
有哪位大侠给翻译成C
解决方案五:
#你是来找解决方案的,长篇理论就不说了,什么不要这样,不要那样的就是废话,c#调用c++为什么要这样做也不是你能决定的给你写了一个没有验证,因为这个还得你调试一下才知道行不行。类型转换你网上找一下[DllImport(dllPath,EntryPoint="DPSDK_QueryAlarmInfo")]//c/c++:intDPSDK_QueryAlarmInfo(INint32_tnPDLLHandle,INAlarm_Query_Info_t*pQuery,//INOUTAlarm_Info_t*pInfo,//INintnFirstNum,//INintnQueryCount,//INintnTimeout=DPSDK_CORE_DEFAULT_TIMEOUT)publicexternstaticintDPSDK_QueryAlarmInfo([In]intnPDLLHandle,[In]IntPtrpQuery,[In,Out]IntPtrpInfo,[In]intnFirstNum,[In]intnQueryCount,[In]intnTimeout);[StructLayout(LayoutKind.Sequential)]publicstructtagAlarmQueryInfo{[MarshalAs(UnmanagedType.ByValTStr,SizeConst=DPSDK_CORE_CHL_ID_LEN)]publicstringszCameraID;//通道IDpublicSystem.UInt64uStartTime;//开始时间publicSystem.UInt64uEndTime;//结束时间/*dpsdk_alarm_dealwith_e这个我不知道是什么类型,如果是int就这样处理*/publicintnDealWith;//报警处理类型,参考表2publicintnAlarmType;//报警类型,参考表3}
还要说明一下,我这个写法是直接把你的结构体变成IntPtr了,你调用的时候需要转换tagAlarmQueryInfoQueryInfo=newtagAlarmQueryInfo();intnSizeOfQueryInfo=Marshal.SizeOf(QueryInfo);IntPtrpQueryInfo=Marshal.AllocHGlobal(nSizeOfQueryInfo);QueryInfo=(tagAlarmQueryInfo)Marshal.PtrToStructure(pQueryInfo,typeof(tagAlarmQueryInfo));Marshal.FreeHGlobal(pQueryInfo);
解决方案六:
其他的结构体你按照一样的方式转换就像了,用的过程中比较麻烦的应该是内存问题。避免c++里面开辟的内存在c#里面释放,一样的避免c#申请的空间在c++里面被释放了。其他应该就是参数转换,加载的时候就要注意dll路径要正确,c++那边应该接口要用c的导出方式