C#调用动态库,C_调用C++DLL

C#调用动态库,C_调用C++DLL

ID:40061222

大小:152.18 KB

页数:10页

时间:2019-07-18

C#调用动态库,C_调用C++DLL_第1页
C#调用动态库,C_调用C++DLL_第2页
C#调用动态库,C_调用C++DLL_第3页
C#调用动态库,C_调用C++DLL_第4页
C#调用动态库,C_调用C++DLL_第5页
资源描述:

《C#调用动态库,C_调用C++DLL》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、(此文详细解说了,C#调用C++DLL的参数传入,与传出,sting类型的传出等)C#调用C++编写的COMDLL封装库时会出现两个问题:1.数据类型转换问题2.指针或地址参数传送问题首先是数据类型转换问题。因为C#是.NET语言,利用的是.NET的基本数据类型,所以实际上是将C++的数据类型与.NET的基本数据类型进行对应。例如C++的原有函数是:int__stdcallFunctionName(unsignedcharparam1,unsignedshortparam2)其中的参数数据类型在C#中,必须转为对应的数据类型。如:[DllImport(“COMDLLpath/f

2、ile”)]externstaticintFunctionName(byteparam1,ushortparam2)因为调用的是__stdcall函数,所以使用了P/Invoke的调用方法。其中的方法FunctionName必须声明为静态外部函数,即加上externstatic声明头。我们可以看到,在调用的过程中,unsignedchar变为了byte,unsignedshort变为了ushort。变换后,参数的数据类型不变,只是声明方式必须改为.NET语言的规范。我们可以通过下表来进行这种转换:Win32TypesCLRTypechar,INT8,SBYTE,CHARSyst

3、em.SByteshort,shortint,INT16,SHORTSystem.Int16int,long,longint,INT32,LONG32,System.Int32BOOL,INT__int64,INT64,LONGLONGSystem.Int64unsignedchar,UINT8,UCHAR,System.ByteBYTEunsignedshort,UINT16,USHORT,System.UInt16WORD,ATOM,WCHAR,__wchar_tunsigned,unsignedint,UINT32,System.UInt32ULONG32,DWORD32

4、,ULONG,DWORD,UINTunsigned__int64,UINT64,System.UInt64DWORDLONG,ULONGLONGfloat,FLOATSystem.Singledouble,longdouble,DOUBLESystem.Double之后再将CLR的数据类型表示方式转换为C#的表示方式。这样一来,函数的参数类型问题就可以解决了。现在,我们再来考虑下一个问题,如果要调用的函数参数是指针或是地址变量,怎么办?对于这种情况可以使用C#提供的非安全代码来进行解决,但是,毕竟是非托管代码,垃圾资源处理不好的话对应用程序是很不利的。所以还是使用C#提供的re

5、f以及out修饰字比较好。同上面一样,我们也举一个例子:int__stdcallFunctionName(unsignedchar¶m1,unsignedchar*param2)在C#中对其进行调用的方法是:[DllImport(“COMDLLpath/file”)]externstaticintFunctionName(refbyteparam1,refbyteparam2)看到这,可能有人会问,&是取地址,*是传送指针,为何都只用ref就可以了呢?一种可能的解释是ref是一个具有重载特性的修饰符,会自动识别是取地址还是传送指针。在实际的情况中,我们利用参数传递地址更

6、多还是用在传送数组首地址上。如:byte[]param1=newparam1(6);在这里我们声明了一个数组,现在要将其的首地址传送过去,只要将param1数组的第一个元素用ref修饰。具体如下:[DllImport(“COMDLLpath/file”)]externstaticintFunctionName(refbyteparam1[1],refbyteparam2)一、发生的背景在开发新项目中使用了新的语言开发C#和新的技术方案WEBService,但是在新项目中,一些旧的模块需要继续使用,一般是采用C或C++或Delphi编写的,如何利用旧模块对于开发人员来说,有三种可

7、用方法供选择:第一、将C或C++函数用C#彻底改写一遍,这样整个项目代码比较统一,维护也方便一些。但是尽管微软以及某些书籍说,C#和C++如何接近,但是改写起来还是很痛苦的事情,特别是C++里的指针和内存操作;第二、将C或C++函数封装成COM,在C#中调用COM比较方便,只是在封装时需要处理C或C++类型和COM类型之间的转换,也有一些麻烦,另外COM还需要注册,注册次数多了又可能导致混乱;第三、将C或C++函数封装成动态链接库,封装的过程简单,工作量不大。因此我决定采用加载动态链接库的方

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。