C# C++调用问题

来源:互联网 发布:windows更新卡在100 编辑:程序博客网 时间:2024/05/21 17:17

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#需要在程序上做一些修改(因其语言存在差异性)

原创粉丝点击