C# C++调用问题

1.C#调用其他语言不一定要经过托管。比方说调用vb的类库,可以走托管的com封装也可以直接调用api访问com。c#有unsafe模式,可以编写非托管代码。vb的内置函数实际上是封装在msvbvmxx.dll等一些基础组件中的,它们有com接口也有导出函数,在c#中均可以访问到。(vb.net程序和类库本身就是.net组件,当然也能访问到。)
2.非托管的c++可以调用.net类库
       希望提高性能可以用c#的unsafe块编写非托管代码,性能会有明显提升。也可以用c++编写具有导出函数或com接口的模块供c#调用。甚至可以将需要运行的机器码用C#写入内存再调用(需要借助api)。。。
总之,你的想法可以实现
3.C++篇
       DLL(在被调用函数前加_delcspec(dllexport))在生成时会自动生成同名lib(包含dll中的符号链接),直接用dll称为显示调用(动态加载),用LoadLibrary和GetProcAddress;用包含lib的方式为隐式调用(需在调用函数前加_delcspec(dllimport)或extern声明,前者可获得更快的编译速度),编译时不需要对应dll,但运行时程序需要能找到该dll,通常放在debug目录下。可以用dumpbin工具查看dll中包含的函数(dumpbin -exports,但看不到函数原型),用depend工具查看程序的依赖项。为了方便二次开发,需在编写dll时提供一个包含函数原型的同名.h头文件(这样在dll实现程序中的函数原型前不用再加dllexport)。
为了调用和被调用端都可以使用该头文件,在源文件中加
#define DLL_API  _delcspec(dllexport)
#include "xx.h"
在xx.h头文件中加
#ifdef DLL_API
#else
#define DLL_API _delcspec(dllimport)
这样同一文件在两端将实现不同的展开
由于C++编译器在编译时会改变函数名,解决方法是
(1)在定义导出函数时加extern "C"(大写),可以解决C++和C语言相互调用问题,但只适合全局函数,不适合类的成员函数;
(2)声明函数时加_stdcall,但函数名仍有可能改变;
(3)使用def文件,强制输出使用的函数名
隐式调用在程序启动时把所需dll全部加载进内存,比较消耗资源。相应库的包含可在工程选项中设置。
注:以上主要归纳自 孙鑫《VC++深入详解》
QT中调用第三方静态库的方法是在pro里用INCLUDEPATH添加库对应的头文件,用LIBS添加库。
4.C#篇
C++的dll是二进制文件,而C#的是一种中间代码,可以添加引用后直接查看,很方便,程序里需using dll中包含的namespace。利用reflector工具可以更清楚的看到其依赖关系。
5.互相调用篇
C++非托管,C#托管,应该是利用公共语言CLR,C#调用C++相对简单,也更有实际意义(利用之前的代码),C++调用C#需要在程序上做一些修改(因其语言存在差异性)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮特大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值