在C#调用C++编写的COM 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)
因为调用的是__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 &param1, unsigned char *param2)
在C#中对其进行调用的方法是:
[DllImport(“ COM DLL path/file ”)]
extern static int FunctionName(ref byte param1, ref byte param2)
看到这,可能有人会问,&是取地址,*是传送指针,为何都只用ref就可以了呢?一种可能的解释是ref是一个具有重载特性的修饰符,会自动识别是取地址还是传送指针。
在实际的情况中,我们利用参数传递地址更多还是用在传送数组首地址上。
如:byte[] param1 = new param1(6);
在这里我们声明了一个数组,现在要将其的首地址传送过去,只要将param1数组的第一个元素用ref修饰。具体如下:
[DllImport(“ COM DLL path/file ”)]
extern static int FunctionName(ref byte param1[1], ref byte param2)

C#调用C++编写的COM DLL相关推荐

  1. Qt如何调用VS编写的动态链接库(dll文件)

    在最近的开发中需要做了demo,来验证公司的老项目能否在Qt上做重新开发:于是碰到的第一个问题那就是dll文件如何加载了:网上查阅了很多资料,记录一下已成功加载dll文件的方法,以防遗忘. 下面是我在 ...

  2. VB.NET工作笔记002---asp调用vb6编写的activex dll

    JAVA技术交流QQ群:170933152 注意这里下面写的,这个小项目,个人发现,仅仅写一个sayHello()方法就可以了,仅仅做个例子的话,不用这么麻烦还写这么多.. 打开VB6,新建Activ ...

  3. 易语言c调用,易语言调用C++编写的DLL

    511遇见网站最近在录制一套易语言编写DLL及调用和Hook,今天记录一下使用VS2015编写一个C++的Dll,易语言来调用. 步骤: 1.启动VS2015 2.创建工程 3.Visual C++ ...

  4. 使用VC编写VB使用DLL

    使用VC编写VB使用DLL 一.在函数定义前必须加上extern "c",_stdcall关键字.  extern "C" int _stdcall Sum(i ...

  5. 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

    from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...

  6. 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现

    转自:Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现_Jaster_wisdom的专栏-CSDN博客 之前在这里和这里调用了matlab自带的一些函数,是通过matl ...

  7. QT调用Saleae C#生成的dll文件

    背景:设计开发PEPS的测试设备时,需要对manchester 等波形采集数据,实际使用时常出现波形解析不准确,设置参数多等原因导致数据采集出现问题.所以冒出个想法是否可以直接使用逻辑分析仪输出的数据 ...

  8. oracle sql 调用自定义函数_PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)...

    PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)​mp.weixin.qq.com https://www.zhihu.com/video/12422083467175 ...

  9. c#.net2005 调用evc4.0生成的dll文件

    又好久没有写博客了,这一段时间一直在做东西,碰到了一些问题并解决掉了,所以把它写出来.写程序时碰到的第一个问题就是用c#.net2005 调用evc4.0生成的dll文件. 首先,在调用自己写的dll ...

最新文章

  1. 《java第二次实验》
  2. 通过COM组件在Web上实现Kinect骨骼追踪、声控截屏保存的功能
  3. 世界各地奇葩讨债方法,竟百发百中
  4. TCP 连接中的TIME_WAIT
  5. NLP-美团技术团队(搜索-推荐-召回排序-Bert)
  6. android 结算权限,如何在Android应用程序中实施应用内结算?
  7. 继谷歌之后 雅虎退出中国音乐市场
  8. 【备忘】最新区块链开发入门到精通视频教程下载
  9. 汇编——dosbox的使用以及文件的运行
  10. php 页面字体大小,网页中各种设置字体大小的方法总结
  11. c语言大刀符号程序,特殊符号大刀图案 | 手游网游页游攻略大全
  12. python sns可视化小技巧(纪录所得)
  13. mac os x excel 单元格换行
  14. 唐巧访谈: iOS大V的技术进阶之路
  15. (十三)office2016-excel提取出生年月
  16. 虚拟磁盘管理器 设备未就绪_多磁盘管理,用于捕获虚拟设备和版本控制
  17. 《蔡康永的201堂情商课(完结)》学习
  18. [数据分析笔记] 网易云歌单分析系列02—pyecharts柱状图
  19. pythonxpath判断元素是否存在_Python Lxml(objectify):检查标签是否存在
  20. JAVA——制作java程序说明书、解决DOS下中文编码问题 GBK

热门文章

  1. win11任务栏怎么设置大小
  2. spring cloud微服务之间调用Feign
  3. poi,HSSFWorkbook,Excel导出,代码示例
  4. JAVA项目实训struts2_JavaWeb学习:Struts2与Spring的IOC练习
  5. C语言随笔小算法:创建双向链表
  6. html在文本框选中后在表格中选中,excel表格出现文本框的解决方法步骤
  7. PHP 缓存 内存,php - 一个大型数组变量的APC内存缓存(22MB)
  8. ❤️《大前端—了解与使用NodesJS》
  9. HTML5新增音频标签(HTML5)
  10. 字体系统之字体粗细(CSS、HTML)