C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
目录:
- 一、前言及背景
- 1.1需求描述
- 1.2常见编程语言对比
- 1.3应用背景
- 二、C++对外接口
- 2.1C++对外封装
- 2.2基于目标平台封装接口形式
- 三、系列文章汇总
一、前言及背景
1.1需求描述
不同的编程语言,具有不同的编程生态环境,对于项目应用来说,没有最优,只有最适应和最匹配!
这启示了我们一点,没有任何一种语言能综合性的做全栈的事情,各种语言的交互有时是最优的应用方案。
- 比如C++在底层的编程生态非常好:OpenCV、VTK、PCL和OpenCasCade等库在图形和可视化方面傲视,但在构建应用端的调试和
- 而C# 被称为工控之王,这应用端进行界面GUI、通信交互、应用构建时效性方面称霸,如MAUI、WPF、.net core等。
- 而python的交互性语言调试,开放的第三方库生态简直傲视群雄,受到科研和人工智能领域受众追捧。
- 诸如 JAVA、Go等编程领域在web开发等领域也各领风骚。
1.2常见编程语言对比
下面以作应用和算法开发比较常见的三种编程语言来对比体现,各自的优劣,综合场景的需求!
1️⃣定位对比:
项目 | C++ | C# | Python |
---|---|---|---|
语言范式 | 编译型、面向对象、泛型、底层控制 | 编译+托管(IL)、面向对象、泛型、托管环境 | 解释型、动态类型、脚本语言、面向对象 |
开发者定位 | 系统/游戏/高性能开发者 | .NET 平台开发者、桌面/企业/Web开发 | AI、数据科学、自动化、快速开发 |
运行环境 | 无需运行时,直接机器码 | .NET CLR/Mono 运行环境 | Python 解释器(CPython、PyPy等) |
应用领域 | 操作系统、驱动、游戏、嵌入式 | 桌面软件、Web、游戏、企业级应用 | AI、ML、脚本、爬虫、数据分析 |
2️⃣执行过程对比:
维度 | C++ | C# (.NET) | Python |
---|---|---|---|
执行方式 | 编译成机器码,直接运行 | 编译成 CIL,JIT 成机器码 | 解释执行,或 JIT(如 PyPy) |
性能 | 🚀 极高(手动内存管理) | 高(JIT 优化) | 中等到低 |
内存管理 | 手动 / RAII / 智能指针 | GC 自动内存管理 | GC 自动内存管理 |
启动速度 | 快(本地执行) | 中等 | 慢(解释器加载) |
并发模型 | 原生线程,复杂 | 线程 + 异步(Task、async/await) | 多线程受 GIL 限制,支持多进程 |
3️⃣优势与劣势对比
语言 | 优势 | 劣势 |
---|---|---|
C++ | - 性能极致 - 控制精细 - 底层开发唯一选项 - 可用于实时系统 | - 学习曲线陡峭 - 容易出错(指针、内存泄漏) - 编译慢 |
C# | - 开发效率高 - 面向对象彻底 - 支持泛型、LINQ、异步良好 - 有效利用 .NET 生态 | - 跨平台初期受限(.NET Core 之后改善) - 与底层交互复杂 |
Python | - 简洁优雅,学习曲线低 - 超强生态(AI、数据分析、自动化) - 丰富第三方库 | - 速度慢(解释执行) - GIL 限制并发 - 类型检查弱 |
4️⃣应用领域对比
领域 | C++ | C# | Python |
---|---|---|---|
游戏引擎 | ✅ Unreal Engine, Unity底层 | ✅ Unity脚本层 | ❌(仅做工具) |
操作系统/驱动 | ✅ 必须用 | ❌ | ❌ |
企业系统 | ❌ | ✅ .NET 强项 | ✅ 但主要是工具和脚本 |
AI/机器学习 | ❌ | ❌ | ✅ 主流框架如 PyTorch、TF |
脚本 & 自动化 | ❌ | ❌ | ✅ 极其适合 |
嵌入式/芯片开发 | ✅ | ❌ | ❌ |
跨平台 UI | ❌ Qt可用 | ✅ MAUI/.NET 6+ | ✅ PyQt/Tkinter 可行 |
5️⃣互操作性对比
场景 | 建议方案 |
---|---|
C# 调用 C++ | C++/CLI 封装或 P/Invoke |
Python 调用 C++ | ctypes、Cython、PyBind11、Boost.Python |
C# 调用 Python | Python.NET、IronPython(有限支持) |
Python 调用 C# | Python.NET、COM、gRPC |
C++ 调用 C# | C++/CLI 或托管宿主 |
1.3应用背景
从做应用项目的角度,我们常见的考虑因素:
- 项目时间;
- 性能;
- 应用场景;
- 基于生态来进行二次开发;
- 是否允许自己造轮子,做生态;
- 各自语言生态对项目开发的依赖权重;
综合上面因素来考虑,现实中,多语言交互配合是综合场景下的最优解方案!
比如,在性能计算方面,C++和C有着不可比拟的性能优势;在GUI界面开发和应用端交互领域,C# 的WPF/Windowform有着快速构建项目工程的优势;在脚本化运行和生态体验上,python有着傲人的用户群体和开发者。
在一个项目中,如果都有以上的需求的话,我们会这么做:C++开发封装接口给C# 调用, C# 做应用端GUI开发与用户层交互,Python作为云服务或者脚本化运行调用生态!
更多的交互场景是:C++封装底层动态库,给第三方语言(包括C++自身)调用!
二、C++对外接口
2.1C++对外封装
动态库(DLL/so) 和 静态库(LIB/a) 是两种常见的C++代码重用和模块化方式,它们各有优劣,适用于不同场景。
1️⃣基本对比:
类型 | 名称 | 文件扩展名(Windows / Linux) | 说明 |
---|---|---|---|
静态库 | Static Library | .lib / .a | 编译时链接,代码会复制进最终可执行程序 |
动态库 | Dynamic Library(共享库) | .dll / .so | 程序运行时加载,节省可执行文件体积 |
注:文件拓展名在不同系统下,生成后缀不一样!
2️⃣使用方式对比:
项目 | 静态库 .lib/.a | 动态库 .dll/.so |
---|---|---|
链接方式 | 编译期链接,合并进 .exe | 编译期链接 .lib ,运行时需 .dll |
部署依赖 | 单独 .exe 即可运行 | .exe + .dll 必须一起发布 |
内存使用 | 多进程加载会有多份拷贝 | 多进程共享内存(节省资源) |
更新维护 | 每次更新库都要重新编译主程序 | 可直接替换 .dll ,热更新友好 |
性能差异 | 稍快(少一次跳转) | 稍慢(函数指针调用开销) |
跨语言调用 | ❌ 不便(链接语言相关) | ✅ 容易通过 extern "C" 暴露接口 |
3️⃣常见应用:C++对外封装,总体来说,是以动态链接库为基础,静态库为辅的一个封装应用(静态库生成可选,如果目标平台是C++,大概率使用,目标平台是C#,则不需要 )!
2.2基于目标平台封装接口形式
基于目标平台来决定封装接口形式
,这句话是重点,同样,有多种的封装形式,没有最优,只有最适应!
常见的接口形式有:
- 1.托管方式:运行和依赖 .NET 的 CLR(公共语言运行库)上,具有 GC 等功能;
- 2.非托管方式:使用传统 C++(如 new/delete),没有用到CLR依赖;
- 3.托管与非托管混合:可以同时使用原生 C++(native C++)和 .NET 托管代码(managed code),兼顾性能和使用C# 相关底层库,方便开发!
1️⃣使用对比:
特性 | 托管(Managed) | 非托管(Unmanaged) |
---|---|---|
编译目标 | CIL + JIT 运行在 CLR | 机器码,直接运行 |
内存管理 | 自动(GC) | 手动(new/delete, malloc/free) |
类型系统 | .NET 类型系统(System::String^ ) | 原生类型系统(std::string ) |
调用约定 | 由 CLR 管理 | 由操作系统 / 编译器决定 |
跨语言调用 | 易与 C# / VB.NET 交互 | 不直接支持,需封装 |
2️⃣应用场景对比:
- 如果是需要直接使用CLR,并且C++对外接口是类方式进行封装,首选托管封装;
- 如果是追求性能,不使用CLR,并且对外接口较简单(交互调用简单),内部封装良好,写好数据转换接口,首选非托管封装;
- 如果是兼顾性能和CLR(GC等)使用,比较推荐托管和非托管结合,其实本质就是更大范围的托管而已;
三、系列文章汇总
本文章为C++动态库总概述,下面会把系列文章更新到以下链接:
(更新中ing敬请关注!)
最后,文中若有不足,敬请批评指正!
相关文章:
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
目录: 一、前言及背景1.1需求描述1.2常见编程语言对比1.3应用背景 二、C对外接口2.1C对外封装2.2基于目标平台封装接口形式 三、系列文章汇总 一、前言及背景 1.1需求描述 不同的编程语言,具有不同的编程生态环境,对于项目应用来说ÿ…...

Google机器学习实践指南(机器学习模型泛化能力)
🔥 Google机器学习(14)-机器学习模型泛化能力解析 Google机器学习(14)-机器学习模型泛化原理与优化(约10分钟) 一、泛化问题引入 ▲ 模型表现对比: 假设森林中树木健康状况预测模型: 图1:初始模型表现 …...

MySQL性能调优:Mysql8高频面试题汇总
1,主键和唯一键有什么区别? 主键不能重复,不能为空,唯一键不能重复,可以为空。 建立主键的目的是让外键来引用。 一个表最多只有一个主键,但可以有很多唯一键 2,MySQL常用的存储引擎有哪些&…...
Neo4j 数据建模:原理、技术与实践指南
Neo4j 作为领先的图数据库,其核心优势在于利用图结构直观地表达和高效地查询复杂关系。其数据建模理念与传统关系型数据库截然不同,专注于实体(节点)及其连接(关系)。以下基于官方文档,系统阐述其建模原理、关键技术、实用技巧及最佳实践: 一、 核心原理:以关系为中心…...
【数据结构知识分享】顺序表详解
一、存储结构 物理相邻性: 若元素 a 和 b 逻辑相邻,则它们在内存中的地址也连续(如 &a[i1] &a[i] sizeof(ElemType))。 内存布局x: 基地址 索引 元素大小,通过首地址直接计算任意位置地址。 …...

vue+elementUI+springboot实现文件合并前端展示文件类型
项目场景: element的table上传文件并渲染出文件名称点击所属行可以查看文件,并且可以导出合并文件,此文章是记录合并文档前端展示的帖子 解决方案: 后端定义三个工具类 分别是pdf,doc和word的excle的目前我没整 word的工具类 package com.sc.modules…...

高效绘制业务流程图!专业模板免费下载
在复杂的业务流程管理中,可视化工具已成为提升效能的核心基础设施。为助力开发者、项目经理及业务架构师高效落地流程标准化,本文将为你精选5套开箱即用的专业流程图模板。这些模板覆盖跨部门协作、电商订单、客户服务等高频场景,具备以下核心…...

Spring Boot + Prometheus 实现应用监控(基于 Actuator 和 Micrometer)
文章目录 Spring Boot Prometheus 实现应用监控(基于 Actuator 和 Micrometer)环境准备示例结构启动和验证验证 Spring Boot 应用Prometheus 抓取配置(静态方式)Grafana 面板配置总结 Spring Boot Prometheus 实现应用监控&…...

PowerBI企业运营分析—列互换式中国式报表分析
PowerBI企业运营分析—列互换式中国式报表分析 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 该平台通过高效整合多源数据,并实时监控关键指标,能够迅速揭示业务表现的全貌&#…...

BugKu Web渗透之需要管理员
启动场景,打开网页,显示如下: 一般没有上面头绪的时候,就是两步:右键查看源代码 和 扫描网站目录。 步骤一: 右键查看源代码 和 扫描网站目录。 右键查看源代码没有发现异常。 于是扫描网站目录&…...
Java集合初始化:Lists.newArrayList vs new ArrayList()
文章目录 前言一、核心区别全景图二、代码实现深度对比1. 初始化方式对比2. 容量预分配机制 三、性能与底层原理1. 内存分配策略2. 基准测试数据(JMH) 四、Guava的进阶功能生态1. 集合转换2. 集合分片3. 不可变集合创建 五、最佳实践指南六、源码级实现解…...
VBA清空数据
列数转字母 Function CNtoW(ByVal num As Long) As String CNtoW Replace(Cells(1, num).Address(False, False), "1", "") End Function 字母转列数 Function CWtoN(ByVal AB As String) As Long CWtoN Range("a1:" & AB & &…...
【信息系统项目管理师-选择真题】2025上半年(第二批)综合知识答案和详解(回忆版)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
Java Lambda 表达式的缺点和替代方案
Java 8 引入的 Lambda 表达式曾被誉为编写简洁、函数式代码的革命性工具。但说实话,它们并不是万能钥匙。它有不少问题,比如它没有宣传的那么易读,在某些场景下还带来性能开销。 作为一名多年与 Java 冗长语法搏斗的开发者,我找到了更注重清晰、可维护性和性能的替代方案。…...

TDengine 开发指南—— UDF函数
UDF 简介 在某些应用场景中,应用逻辑需要的查询功能无法直接使用内置函数来实现,TDengine 允许编写用户自定义函数(UDF),以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后,可以像系统内置函数一…...

使用vsftpd搭建FTP服务器(TLS/SSL显式加密)
安装vsftpd服务 使用vsftpd RPM安装包安装即可,如果可以访问YUM镜像源,通过dnf或者yum工具更加方便。 yum -y install vsftpd 启动vsftpd、查看服务状态 systemctl enable vsftpd systemctl start vsftpd systemctl status vsftpd 备份配置文件并进…...

1.1Nodejs和浏览器中的二进制处理
Buffer 在 Node.js 中,Buffer 类用于处理二进制数据。由于 JavaScript 在浏览器环境中主要用于处理字符串和数字等类型的数据,对二进制数据的处理能力较弱,因此 Node.js 引入了 Buffer 类来弥补这一不足,特别是在处理文件系统操作…...

入门AJAX——XMLHttpRequest(Post)
一、前言 在上篇文章中,我们已经介绍了 HMLHttpRequest 的GET 请求的基本用法,并基于我提供的接口练习了两个简单的例子。如果你还没有看过第一篇文章,强烈建议你在学习完上篇文章后再学习本篇文章: 🔗入门AJAX——XM…...

Qt(part1)Qpushbutton,信号与槽,对象树,自定义信号与槽,lamda表达式。
1、创建Qt程序 2、命名规范及快捷键 3、Qpushbutton按钮创建 4、对象树概念 5、信号与槽 6、自定义信号与槽 7、当自定义信号和槽发生重载时 8、信号可以连接信号,信号也可以断开。 9、lamda表达式...

西北某省级联通公司:3D动环模块如何实现机房“一屏统管”?
一、运营商机房监控痛点凸显 在通信行业快速发展的当下,西北某省级联通公司肩负着保障区域通信畅通的重任。然而,公司分布广泛的机房面临着诸多监控难题,尤其是偏远机房环境风险无法实时感知这一痛点,严重影响了机房的稳定运行和通…...
【WPF】从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法
✨ 从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法 在日常 WPF 开发中,我们经常需要对数据进行筛选、排序、分组等操作,而原生的 ItemsControl 并不直接支持这些功能。本文将介绍如何通过 CollectionVi…...
Zookeeper 和 Kafka 版本与 JDK 要求
Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …...
3步布局关键词让流量更精准
其实流量不精准,90% 是关键词没布局好! 掌握这 3 个超实用技巧,让你的内容精准推给目标人群! 第一步:深挖高潜力关键词 别再一股脑用 “好看”“好用” 这些泛词啦!打开平台搜索框,输入核心词…...

视觉分析在人员行为属性检测中的应用
基于视觉分析的人员行为属性检测方案 一、背景与需求分析 在工业生产、建筑施工、公共安全等领域,人员行为属性的合规性检测是保障安全生产的关键环节。例如,工地工人未佩戴安全帽、厨房人员未佩戴手套、作业现场人员使用手机等行为,均可能…...
学习 React【Plan - June - Week 1】
一、使用 JSX 书写标签语言 JSX 是一种 JavaScript 的语法扩展,React 使用它来描述用户界面。 什么是 JSX? JSX 是 JavaScript 的一种语法扩展。看起来像 HTML,但它实际上是在 JavaScript 代码中写 XML/HTML。浏览器并不能直接运行 JSX&…...

电子行业AI赋能软件开发经典案例——某金融软件公司
01.案例标题 金融行业某金融软件公司通过StarShip CodeSouler达成效率突破性增长,零流程侵入验证AI代码高度可行性 02.执行摘要 某金融软件公司在核心产品研发中引入开放传神(OpenCSG)的StarShip CodeSouler AI代码生成平台,在无…...
【前端】js如何处理计算精度问题
JavaScript 的精度问题源于其遵循 IEEE 754 标准的 64 位双精度浮点数表示法,导致 0.1 0.2 ! 0.3 等经典问题。以下是系统化的解决方案及适用场景: ⚙️ 一、整数转换法(适合简单运算) 将小数转换为整数运算后再还原࿰…...
使用 Python 自动化 Word 文档样式复制与内容生成
在办公自动化领域,如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例,展示如何利用 Python 的 python-docx 库实现 Word 文档样式的深度复制 和 动态内容生成,并结合知识库中的最佳实践优化文档处理流程…...
Kafka 核心架构与消息模型深度解析(二)
案例实战:Kafka 在实际场景中的应用 (一)案例背景与需求介绍 假设我们正在为一个大型电商平台构建数据处理系统。该电商平台拥有庞大的用户群体,每天会产生海量的订单数据、用户行为数据(如浏览、点击、收藏等&#…...
4G网络中频段的分配
国内三大运营商使用的4G网络频段及对应关系如下: 📶 一、中国移动(以TD-LTE为主) 主力频段 Band 38(2570-2620MHz):室内覆盖Band 39(1880-1920MHz):广覆盖&am…...