C++/C#混合编程概览

本系列文章的重点聚集在C+ +/CLI的以下三个方面:

  1. C+ +/CLI的基本语法,以及开发者理解它的一种感性视角。
  2. C+ +/CLI封装.NET库供原生C+ +项目使用的实现步骤。
  3. 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项目调用的实现步骤。

评论