在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. usaco Hamming Codes
  2. 目前微服务/REST的最佳技术栈
  3. 这些产品基本功了解一下?
  4. 5月9日 python学习总结 外键、表之间的关联关系、修改表、清空表内容、复制表...
  5. 信息流服务器哪种好,选购存储服务器需要注意六大关键因素,你知道几个?
  6. 扔盘子(51Nod-1279)
  7. sata接口_解决主板SATA接口不足:乐扩PCIe2.0转8口SATA3/6G扩展卡
  8. 聊聊四种Oracle数字取整函数
  9. android socket 代理服务器,Android 使用Socket进行服务器通信
  10. PyTorch 1.0 中文官方教程:使用 PyTorch 进行图像风格转换
  11. 第 15 篇:优化博客功能的细节,提升使用体验—— HelloDjango 系列教程
  12. Vue 系列二 之 猛龙行动之绝密代码
  13. 关于安装mysql环境闪退无法安装
  14. 幼儿计算机教材有哪些,中华字经幼儿教材
  15. 直播APP开发如何得到用户青睐?
  16. 浅谈 Android Dex 文件
  17. 理解C语言——从小菜到大神的晋级之路(15)——完结篇:C编程风格
  18. ebtables Basic examples
  19. photoshop快捷键大全
  20. 高德地图精确定位和获取地理位置

热门文章

  1. 计算机间盘的使用方法,电脑怎样分盘操作,史上最全分盘操作教程示意图
  2. python基础教程期末考试题库_PYTHON语言应用试题题目及答案,课程2020最新期末考试题库,章节测验答案...
  3. haproxy配置代理tomcat和nginx_Nginx负载均衡配置实例
  4. js记录访问网页的ip_亚马逊新手记录之避免店铺关联
  5. 2D转换综合写法(CSS3)
  6. OpenCV medianBlur、GaussianBlur和bilateralFilter (中值滤波、高斯滤波、双边滤波)
  7. 前端每日实战:73# 视频演示如何用纯 CSS 创作一只卡通狐狸
  8. 数据库中的完整性约束及实例
  9. image.merge图像有什么变化_图像特征工程:HOG特征描述子介绍
  10. C#------如何获取本机IP地址