请教C++调用DLL改用C#调用DLL方法和类型映射

问题描述

现在有一个C++的dll,原来是C++项目使用,现在有一个C#项目想使用这个DLL,调用这个dll的时候一些类型映射,不知道C++中的类型,应该映射成C#中的什么类型,该怎么写,请教大神。C++调用DLL的代码如下主要不知道下面这三种C++中的参数,用C#改写该映射成什么类型constTCHAR*sLogDirconststd::list<conststd::pair<LPCSTR,LPCSTR>>&listParamsParamPair*pPairs

reaper.htypedefint(*FP_INIT)(HANDLEhWnd,constTCHAR*sLogDir);typedefvoid(*FP_TRACK_EVENT)(constTCHAR*sCategory,constTCHAR*sAction,constTCHAR*sLabel,INTiValue,#ifndefUNICODEstd::list<std::pair<std::string,std::string>>&listParams);#elsestd::list<std::pair<std::wstring,std::wstring>>&listParams);#endiftypedefvoid(*FP_TRACK_EVENT_NEW)(constTCHAR*sCategory,constTCHAR*sAction,constTCHAR*sLabel,INTiValue,#ifndefUNICODEconststd::list<conststd::pair<LPCSTR,LPCSTR>>&listParams);#elseconststd::list<conststd::pair<LPCWSTR,LPCWSTR>>&listParams);#endiftypedefvoid(*FP_TRACK_EVENT2)(constTCHAR*sCategory,constTCHAR*sAction,constTCHAR*sLabel,INTiValue,intiPairCount,ParamPair*pPairs);classReaper{public:intinit(HANDLEhWnd,constTCHAR*sLogDir);voidtrackEvent(constTCHAR*sCategory,constTCHAR*sAction,constTCHAR*sLabel,INTiValue,#ifndefUNICODEstd::list<std::pair<std::string,std::string>>&listParams);#elsestd::list<std::pair<std::wstring,std::wstring>>&listParams);#endifvoidtrackEventNew(constTCHAR*sCategory,constTCHAR*sAction,constTCHAR*sLabel,INTiValue,#ifndefUNICODEconststd::list<conststd::pair<LPCSTR,LPCSTR>>&listParams);#elseconststd::list<conststd::pair<LPCWSTR,LPCWSTR>>&listParams);#endifvoidtrackEvent2(constTCHAR*sCategory,constTCHAR*sAction,constTCHAR*sLabel,INTiValue,intiPairCount,ParamPair*pPairs);}

reaper.cppFP_TRACK_EVENTReaper::_fpTrackEvent=NULL;FP_TRACK_EVENT_NEWReaper::_fpTrackEventNew=NULL;FP_TRACK_EVENT2Reaper::_fpTrackEvent2=NULL;boolReaper::initLib(){_fpInit=(FP_INIT)::GetProcAddress(_hLib,"initialize");_fpTrackEvent=(FP_TRACK_EVENT)::GetProcAddress(_hLib,"trackEvent");_fpTrackEventNew=(FP_TRACK_EVENT_NEW)::GetProcAddress(_hLib,"trackEventNew");_fpTrackEvent2=(FP_TRACK_EVENT2)::GetProcAddress(_hLib,"trackEvent2");}

C#中我现在做了如下,主要不知道类型到底该映射成什么样请指教Reaper.cspublicclassReaper{publicdelegateintFP_INIT(IntPtrhWnd,stringsLogDir);publicdelegatevoidFP_TRACK_EVENT(stringsCategory,stringsAction,stringsLabel,intiValue,Dictionary<string,string>listParams);publicdelegatevoidFP_TRACK_EVENT_NEW(stringsCategory,stringsAction,stringsLabel,intiValue,Dictionary<string,string>listParams);publicdelegatevoidFP_TRACK_EVENT2(stringsCategory,stringsAction,stringsLabel,intiValue,intiPairCount,Dictionary<string,string>listParams);publicboolinitLib(){DllWrapper_hLib=newDllWrapper();_hLib.Init("reaper.dll");FP_INIT_fpInit=(FP_INIT)_hLib.GetFunctionAddress("initialize",typeof(FP_INIT));FP_TRACK_EVENT_fpTrackEvent=(FP_TRACK_EVENT)_hLib.GetFunctionAddress("trackEvent",typeof(FP_TRACK_EVENT));FP_TRACK_EVENT_NEW_fpTrackEventNew=(FP_TRACK_EVENT_NEW)_hLib.GetFunctionAddress("trackEventNew",typeof(FP_TRACK_EVENT_NEW));FP_TRACK_EVENT2_fpTrackEvent2=(FP_TRACK_EVENT2)_hLib.GetFunctionAddress("trackEvent2",typeof(FP_TRACK_EVENT2));}}publicclassDllWrapper{privateIntPtrdllHnd;[DllImport("Kernel32")]publicstaticexternIntPtrGetProcAddress(IntPtrhandle,stringfuncname);[DllImport("Kernel32")]publicstaticexternIntPtrLoadLibrary(stringname);[DllImport("Kernel32")]publicstaticexternIntPtrFreeLibrary(IntPtrhandle);publicvoidInit(stringmoduleName){this.dllHnd=DllWrapper.LoadLibrary(moduleName);}publicDelegateGetFunctionAddress(stringfunctionName,Typet){IntPtrprocAddress=DllWrapper.GetProcAddress(this.dllHnd,functionName);returnMarshal.GetDelegateForFunctionPointer(procAddress,t);}publicvoidFinit(){DllWrapper.FreeLibrary(this.dllHnd);this.dllHnd=newIntPtr(0);}}

解决方案

本帖最后由 dudou681 于 2016-03-19 11:42:13 编辑
解决方案二:
三个统统能用IntPtr代替不过第二个要在c++那侧构造,c#只能作为中间人传递
解决方案三:
从C#调用其他语言的DLL时,参数只能是两边都支持的基本类型,如整数,字符串,字节数组,以及由此组成的结构体.pair泛型我看肯定不行,而且方法的参数必须是STDCALL约定
解决方案四:
谢谢楼上两位的回复我想知道具体一点的,不知道是否有大神可以指教下
解决方案五:
希望今天上班的人多,有大神可以帮助我解决

时间: 2024-08-04 14:23:20

请教C++调用DLL改用C#调用DLL方法和类型映射的相关文章

使用JNative调用C# DLL文件 提示未找到方法

问题描述 最近项目需要使用一个C#的DLL文件的方法,用JNative去实现的,JNativeCpp.dll和需要调用的dll文件都放到windows/system32下了,然后newJNative("ABC.Portal.Common.dll","Token");提示这个Token方法找不到.org.xvolks.jnative.exceptions.NativeException:FunctionTokennotfoundatorg.xvolks.jnative

vc++-如何VB6.0 调用 MATLAB r2010b 生成的DLL ?

问题描述 如何VB6.0 调用 MATLAB r2010b 生成的DLL ? 如何VB6.0 调用 MATLAB r2010b 生成的DLL ?我已经用VS 2010 的 VC++ 2010编译器 生成了MATLAB r2010b M文件的DLL了,MATLAB 里 的 M文件的内容是function c=Sum2(ab) c=a+b; end 而且在VB 引用中加入了这个DLL,名为Sum2VB代码里面是:Private a As DoublePrivate b As DoublePrivat

用dotfuscator混淆器混淆后的dll,怎么调用不了??急!

问题描述 用dotfuscator混淆器混淆后的dll,怎么调用不了??急!混淆后的dll里面的类名,方法名都变了,可是程序也调用不了这个dll了,要这样的混淆器有什么用呀.请教一下,怎么解决这个问题. 解决方案 解决方案二:还没混淆破解的人先把自己混淆了...解决方案三:估计是混淆的时候勾选了混淆方法名吧你在看看混淆的设置解决方案四:混淆本来就很多问题.你需要混淆exe关联这些dll.一般混淆的东西,你过多使用反射的情况下都有问题.解决方案五:引用1楼的回复: 还没混淆破解的人先把自己混淆了.

C#如何调用一个DELPHI写的dll

问题描述 兄弟们我有个问题请教一下:我用C#调用一个DELPHI写的dll,dll中有integer,pchar,single数据类型,integer和single类型都能读出来就是读pchar类型有问题,这个函数是个读卡函数,调用会报这个错"对PInvoke函数"WindowsApplication1!WindowsApplication1.mz_读医保卡::Freadcard"的调用导致堆栈不对称.原因可能是托管的PInvoke签名与非托管的目标签名不匹配.请检查PInv

asp.net源程序编译为dll文件并调用过程

使用csc命令将.cs文件编译成.dll的过程 很多时候,我们需要将.cs文件单独编译成.dll文件, 操作如下: 打开命令窗口->输入cmd到控制台->cd C:WINDOWSMicrosoft.NETFrameworkv1.1.4322 转到vs.net安装的该目录下->执行csc命令csc /target:library File.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:WINDOWSMicrosoft.NETFrameworkv1.1.4

异常-C#调用动态库,无法加载 DLL&amp;amp;quot;xx.dll&amp;amp;quot;: 找不到指定的模块。

问题描述 C#调用动态库,无法加载 DLL"xx.dll": 找不到指定的模块. 报错内容:System.DllNotFoundException: 无法加载 DLL"XX.dll": 找不到指定的模块. (异常来自 HRESULT:0x8007007E). 网上的各种方法我都试过了,都是这样 我把目标平台改成x64,报错就变成:System.BadImageFormatException: 试图加载格式不正确的程序. (异常来自 HRESULT:0x8007000

com-C++ 如何调用Delphi的dll文件中的COM方法

问题描述 C++ 如何调用Delphi的dll文件中的COM方法 请问 C++ 如何 调用 Delphi 的dll文件中的COM方法 解决方案 只要是COM就遵守COM的规范,Delphi写出来的COM和其他语言写出来的COM用法是一样的

vc++-VC6如何在生成动态链结库的文件(DLL)里调用SQL2000

问题描述 VC6如何在生成动态链结库的文件(DLL)里调用SQL2000 VC6如何在生成动态链接库的文件(DLL)里调用SQL2000,最终该文件要用于VFP环境内, 也就是要在SET LIBARY TO XX.DLL里调用里的函数,该问题很是急,麻烦大侠们高抬贵 手! 解决方案 VC产生动态链接库以及调用sql server都不麻烦,只是看你vfp能不能调用了.你的具体问题是什么. 解决方案二: 生成标准windows DLL,用_stdcall调用约定来封装DLL的导出函数等. 解决方案三

activex-C#开发ActiveX控件调用dll文件时,dll文件放在什么位置,我的出错了

问题描述 C#开发ActiveX控件调用dll文件时,dll文件放在什么位置,我的出错了 通过c#谢了一个很简单的Activex控件,调用dll文件(dll文件是c++写的,并且dll文件不是com组件),在普通的容器中调用动态库都没问题,但是通过activex时就会出错,请问这是问什么,请留言,也可以加我qq:574225218 解决方案 在dll文件中调用VBA的命令 解决方案二: 是在IE中测试出错么?尝试把浏览器的安全等级设置全部调到最低,在客户端安装.net framework并且运行