C#调用非托管DLL(数据类型)
来源:互联网 发布:计算机 出国 知乎 编辑:程序博客网 时间:2024/06/04 11:01
C#时常需要调用C++ 编写的 DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家:
VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等
但转为C#类型却不完全相同。
但转为C#类型却不完全相同。
主要有如下几种转换:
将string转为IntPtr:IntPtr System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(string)
将IntPtr转为string:string System.Runtime.InteropServices.MarshalPtrToStringAuto(IntPtr)
类型对照:
BSTR ----------- StringBuilder
LPCTSTR ----------- StringBuilder
LPCWSTR ----------- IntPtr
handle ----------- IntPtr
hwnd ----------- IntPtr
char * ----------- string
int * ----------- ref int
int & ----------- ref int
void * ----------- IntPtr
unsigned char * ----------- ref byte
Struct需要在C#里重新定义一个Struct
CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);
注意在每个函数的前面加上public static extern +返回的数据类型,如果不加public ,函数默认为私有函数,调用就会出错。
在C#调用C++ DLL封装库时会出现两个问题:
1. 数据类型转换问题
2. 指针或地址参数传送问题
首先是数据类型转换问题。因为C#是.NET语言,利用的是.NET的基本数据类型,所以实际上是将C++的数据类型与.NET的基本数据类型进行对应。
例如C++的原有函数是:
int __stdcall FunctionName(unsigned char param1, unsigned short param2)
其中的参数数据类型在C#中,必须转为对应的数据类型。如:
[DllImport(“ COM DLL path/file ”)]
extern static int FunctionName(byte param1, ushort param2)
extern static int FunctionName(byte param1, ushort param2)
因为调用的是__stdcall函数,所以使用了P/Invoke的调用方法。其中的方法FunctionName必须声明为静态外部函数,即加上extern static声明头。我们可以看到,在调用的过程中,unsigned char变为了byte,unsigned short变为了ushort。变换后,参数的数据类型不变,只是声明方式必须改为.NET语言的规范。
我们可以通过下表来进行这种转换:
Win32 Types | CLR Type |
char, INT8, SBYTE, CHAR | System.SByte |
short, short int, INT16, SHORT | System.Int16 |
int, long, long int, INT32, LONG32, BOOL , INT | System.Int32 |
__int64, INT64, LONGLONG | System.Int64 |
unsigned char, UINT8, UCHAR , BYTE | System.Byte |
unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t | System.UInt16 |
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT | System.UInt32 |
unsigned __int64, UINT64, DWORDLONG, ULONGLONG | System.UInt64 |
float, FLOAT | System.Single |
double, long double, DOUBLE | System.Double |
之后再将CLR的数据类型表示方式转换为C#的表示方式。这样一来,函数的参数类型问题就可以解决了。
现在,我们再来考虑下一个问题,如果要调用的函数参数是指针或是地址变量,怎么办?
对于这种情况可以使用C#提供的非安全代码来进行解决,但是,毕竟是非托管代码,垃圾资源处理不好的话对应用程序是很不利的。所以还是使用C#提供的ref以及out修饰字比较好。
同上面一样,我们也举一个例子:
int __stdcall FunctionName(unsigned char ¶m1, unsigned char *param2)
在C#中对其进行调用的方法是:
[DllImport(“ file ”)]
extern static int FunctionName(ref byte param1, ref byte param2)
extern static int FunctionName(ref byte param1, ref byte param2)
看到这,可能有人会问,&是取地址,*是传送指针,为何都只用ref就可以了呢?一种可能的解释是ref是一个具有重载特性的修饰符,会自动识别是取地址还是传送指针。
在实际的情况中,我们利用参数传递地址更多还是用在传送数组首地址上。
如:byte[] param1 = new param1(6);
如:byte[] param1 = new param1(6);
在这里我们声明了一个数组,现在要将其的首地址传送过去,只要将param1数组的第一个元素用ref修饰。具体如下:
[DllImport(“ file ”)]
extern static int FunctionName(ref byte param1[1], ref byte param2)
extern static int FunctionName(ref byte param1[1], ref byte param2)
0
上一篇:使用ActiveSync同步WinCE设备,并在局域网中调试网络程序
下一篇:WinCE的非MFC程序中使用CString
相关热门文章
- “管理优化校准”菜单用于修改...
- 系统调用详解
- libvirt架构及源码分析(一)...
- dos to unix 或 unix to dos
- PHP_封装时的四个魔术方法...
- linux守护进程的几个关键地方...
- stagefright与opencore对比
- 嵌入式Linux之我行——u-boot-...
- 嵌入式Linux之我行——内核、...
- android的logcat详细用法
- 如何编写一个C程序实现将字符...
- C程序能不能在main函数之前调...
- 看一个程序调用了哪些动态库用...
- 回复不了你啊,咋,威望值不够...
- mysql的medium.cnf在哪里?...
给主人留下些什么吧!~~
评论热议
- C#调用非托管DLL(数据类型)
- C#调用非托管DLL(数据类型)
- C#调用非托管C编写DLL的数据类型转换
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管Dll
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管DLL
- C#调用非托管dll
- C#调用非托管DLL
- C#调用托管DLL与非托管DLL
- C#动态调用非托管DLL(一)
- C#动态调用非托管DLL(二)
- C#调用非托管DLL的APIs
- C#动态调用非托管DLL
- C#调用非托管DLL的APIs
- 使用C#调用非托管DLL函数
- 定制3G数据传输终端(3G DTU)
- WinCE下编写USB client驱动时会用到的一些API
- WinCE下将SQLite数据库导入到另外一个SQLite数据库
- MFC之缓冲绘图
- 使用ActiveSync同步WinCE设备,并在局域网中调试网络程序
- C#调用非托管DLL(数据类型)
- 《Directx 9.0 3D 游戏开发编程基础》学习总结1--环境配置
- WinCE的非MFC程序中使用CString
- WinCE隐藏任务栏
- WinCE的USB Device功能实现(Serial,RNDIS,Mass_Storage)
- WinCE下的USB游戏手柄驱动 GamePad Joystick
- Samsung的ARM处理器iROM启动模式介绍
- EBoot支持SD卡下载升级Bootloader和WinCE系统
- VS2005重新配置(在VS出现小问题时使用)
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
股票实战交流群
推荐股票的qq群
免费股票交流qq群
比较好的股票交流群
散户股票交流qq群
有什么好的股票群
免费的股票交流群
在哪炒股
炒股指南
炒股经历
炒股散户好
四川爆炒肥肠的做法
肥肠怎么炒才脆嫩爽滑的做法
火爆肥肠怎么炒才脆嫩爽滑
生爆肥肠怎么爆炒才脆
生炒肥肠怎样才脆嫩爽滑
炒猪肺的家常做法
炒藕片做法
藕怎么炒
藕怎么炒好吃
青椒炒藕片
如何炒藕片好吃又简单
青椒炒藕
炒藕片怎么做好吃
炝炒藕片
炒藕条
五花肉炒藕片
藕片怎么炒好吃
怎样炒藕片好吃又简单
家常炒藕
清炒藕片的做法
炒糖醋藕片家常做法
青椒炒藕片的做法窍门
炒藕片的做法
炒藕做法大全家常
炒藕的做法
炒藕片怎么做
素炒藕片的家常做法
炒藕用不用焯水
炒藕片的做法大全
素炒藕片怎么炒好吃