C++/C#混合编程概览
本系列文章的重点聚集在C+ +/CLI的以下三个方面:
- C+ +/CLI的基本语法,以及开发者理解它的一种感性视角。
- C+ +/CLI封装.NET库供原生C+ +项目使用的实现步骤。
- C+ +/CLI封装原生C+ +库供.NET项目使用的实现步骤。
混合编程的意义
C+ +简介
C+ +源代码编译后直接生成平台相关的二进制文件,运行效率极高;允许内存操作,适合底层系统开发;很多基础设施或大型软件都采用C+ +进行开发,这也促进了该语言的生态繁荣。
优点很多,但C+ +为人诟病的缺点也不少,例如:灵活高效的指针也带来了很多麻烦、语言越来越复杂等。
C#简介
C#逐渐替代C+ +成为微软阵营的顶流语言,其市场份额逐渐增大,并荣获了“TIOBE 2023年度编程语言”的称号,发展势头可见一斑!
与Java类似,C#源代码编译之后也会生成中间语言,继而在.NET虚拟机上执行,虚拟机提供内存管理、垃圾回收的功能。
C#是纯粹的面向对象编程语言,学习曲线平缓;胜任多种类型的程序开发(如Web前后端、桌面程序等);提供垃圾回收器机制,内存管理安全高效;有NuGet包管理器,海量开源库下载即用!
且在工业软件二次开发领域,C#基本是一种标配,如AutoCAD、Revit等。
C#的不足之处在于:编写的程序非常容易被反编译成源代码,代码混淆器也很难根治这个问题;在计算密集型程序中,该语言还有待提升竞争力。
混合编程的使用场景
C+ +和C#是两种设计思想差异很大的编程语言,各有优劣,某些场景下需要将两者优势互补。
(1)跨语言复用程序库
采用C+ +进行项目开发时,如果需要用到既有C#类库,这时最好的方式是采用混合编程将既有C#类库封装起来,供C+ +项目调用;反之同理。
(2)软件保护
C#开发的软件保密性差,商业软件的核心技术模块最好采用C+ +编写,采用混合编程的方式封装该模块供C#主项目调用。
(3)软件整体性能提升
C#性能还无法匹敌C+ +,在C#项目中存在计算密集型的操作时,可使用C+ +编写核心计算模块,通过混合编程的方式嵌入C#主项目中,进而提升软件的整体性能。
混合编程的方法
C+ +和C#是微软生态的两个主力语言,Visual Studio对两者都有非常好的支持,微软也为C+ +/C#混合编程提供了非常强大的工具。
C+ +/CLI
C+ +/CLI是一种C+ +变体语言,在支持原生C+ +语法的基础上,引入了一系列新的语法特性来支持托管代码的编写。C+ +/CLI项目可引入原生C+ +动态链接库或静态库,也支持引用C#类库,为实现跨语言调用程序库提供了语言基础。C+ +/CLI是最完美的C+ +/C#混合编程方案。
使用C+ +/CLI有三种模式:① 仅使用原生C+ +代码;② 仅使用托管代码;③ 使用原生C+ +和托管混合代码。当然,第③中模式才是重点,对于第①、②两种场景可直接构建原生的C+ +或C#项目。
P/Invoke
P/Invoke是.NET提供的一种轻量机制,允许托管代码调用C/C+ +编写的原生代码;不支持C+ +调用C#代码。
当C#项目需要调用少量原生代码时,这种方式可以作为首选方案。
COM
COM(Component Object Model)是微软早期提出的一种软件架构,允许软件组件在不同的编程语言之间进行交互。其编程较为复杂,且部署依赖Windows注册表;在某些方面,.NET框架已成为更好的技术方案。本文不做进一步介绍。
本系列文章的重点
本系列文章的重点聚集在C+ +/CLI的以下三个方面:
(1)C+ +/CLI的基本语法,以及开发者理解它的一种感性视角。
(2)C+ +/CLI封装.NET库供原生C+ +项目调用的实现步骤。
(3)C+ +/CLI封装原生C+ +库供.NET项目调用的实现步骤。