C#调用C++ DLL方法之C++/CLI(托管C++)
托管C++与C++/CLI前世今生
C++/CLI (C++/Common Language Infrastructure) 是一种用于编写托管代码的语言扩展,它是为了与 .NET Framework 进行互操作而设计的。C++/CLI 是 C++ 的一种方言,它引入了一些新的语法和关键字,以便更好地支持 .NET 类型和垃圾回收。
托管C++ (Managed Extensions for C++) 是早期的一种用于编写托管代码的语言扩展,它也是为了与 .NET Framework 进行互操作而设计的。托管C++ 是 C++ 的一种扩展,但它的语法和使用方式相对复杂和不直观。
以下是 C++/CLI 和托管C++ 的一些主要区别:
-
语法和关键字:
C++/CLI 引入了新的语法和关键字,如ref class
、^
(句柄) 和gcnew
,
使得编写托管代码更加直观和简洁。
托管C++ 使用__gc
、__value
等前缀来标识托管类型,语法相对复杂。 -
类型系统:
C++/CLI 更好地集成了 .NET 类型系统,支持泛型、委托和事件等特性。
托管C++ 对 .NET 类型系统的支持较为有限,使用起来不如 C++/CLI 方便。 -
性能和优化:
C++/CLI 在性能和优化方面进行了改进,生成的代码更高效。
托管C++ 的性能相对较差,生成的代码效率不如 C++/CLI。 -
兼容性和支持:
C++/CLI 是当前主流的用于编写托管代码的 C++ 扩展,得到了更好的支持和维护。
托管C++ 已经被弃用,不再推荐使用。
参考文献
Managed Extensions for C++
C++/CLI
代码示例
C++部分
//.h
#ifndef HEADER_H
#define HEADER_H#include <stdio.h>
#include <stdlib.h>
#include <iostream>using namespace std;#ifdef MYCLASS_EXPORTS
#define MYCLASS_EXPORTS __declspec(dllexport)
#else
#define MYCLASS_EXPORTS __declspec(dllimport)
#endifextern "C" MYCLASS_EXPORTS int Add(int numberA, int numberB);class MyClass
{public:MyClass();~MyClass();};#endif // !HEADER_H//c.pp
#include "header.h"MyClass::MyClass()
{
}MyClass::~MyClass()
{
}MYCLASS_EXPORTS int Add(int numberA, int numberB)
{// 计算两个数的和int result = numberA + numberB;// 返回结果return result;
}
1.设置预处理器
2.输出dll
CLR部分
//.h
#ifndef HEADER_H
#define HEADER_H#include <iostream>
#include "../MyDll/header.h"//引用库声明对应文件路径public ref class MyClrClass
{
public:MyClrClass();int AddCode(int numberA, int numberB);
};#endif // !HEADER_H//.cpp
#include "header.h"MyClrClass::MyClrClass()
{
}int MyClrClass::AddCode(int numberA, int numberB)
{return Add(numberA, numberB);
}
1.修改公共语言运行时支持
2.设置语言符合模式
3.引用前面c++部分
4.输出目标dll
C#调用部分
var a = 10;
var b = 20;
var invoke = new MyClrClass();
var addResult = invoke.AddCode(a, b);
Console.WriteLine($"Add result is {addResult}");
添加CLR dll
输出结果
相关文章:

C#调用C++ DLL方法之C++/CLI(托管C++)
托管C与C/CLI前世今生 C/CLI (C/Common Language Infrastructure) 是一种用于编写托管代码的语言扩展,它是为了与 .NET Framework 进行互操作而设计的。C/CLI 是 C 的一种方言,它引入了一些新的语法和关键字,以便更好地支持 .NET 类型和垃圾…...
免费搭建一个属于自己的个性化博客(Hexo+Fluid+Github)
文章目录 0.简介1. 下载安装fluid主题2. 创建文章3. 添加分类及标签3.1 创建“分类”选项3.2 创建“标签”选项4. 文章中插入图片5. 添加阅读量统计6. 添加评论功能7. 显示文章更新时间8. 为hexo添加latex支持小结参考文献0.简介 通过HEXO模板和Fluid主题搭建自己的博客,预览…...

vue3 开发利器——unplugin-auto-import
这玩意儿是干啥的? 还记得 Vue 3 的组合式 API 语法吗?如果有印象,那你肯定对以下代码有着刻入 DNA 般的熟悉: 刚开始写觉得没什么,但是后来渐渐发现,这玩意儿几乎每个页面都有啊! 每次都要写…...
开发需求总结19-vue 根据后端返回一年的数据,过滤出符合条件数据
需求描述: 定义时间分界点:每月26号8点,过了26号8点则过滤出data数组中符合条件数据下个月的数据,否则过滤出当月数据 1.假如现在是2024年11月14日,那么过滤出data数组中日期都是2024-11月的数据; 2.假如…...

人工智能如何改变创新和创造力?
王琼工作室 输出的力量 有了GPT这样的人工智能平台,创新和创造力的机会在哪里? 我们是否有信心: 面对效率,超越效率。 把问题拓展为机会? 把机会拓展为价值? 让智能更好地和我们协作,走心、走…...
Github 基本使用学习笔记
1. 基本概念 1.1 一些名词 Repository(仓库) 用来存放代码,每个项目都有一个独立的仓库。 Star(收藏) 收藏你喜欢的项目,方便以后查看。 Fork(克隆复制项目) 复制别人的仓库&…...
群论入门笔记
群的基本定义 群由一组元素 G 和一个运算(常用符号包括 ,x , 或 ∗)组成。 封闭性 对于任意两个元素 x,y∈G,运算 x * y 的结果仍然属于集合 G,即: ∀x,y∈G,x∗y∈G. 结合律 对于任意 a,b,c∈G&…...

2024最新python使用yt-dlp
2024最新python使用yt-dlp下载YT视频 1.获取yt的cookie1)google浏览器下载Get cookies.txt LOCALLY插件2)导出cookie 2.yt-dlp下载[yt-dlp的GitHub地址](https://github.com/yt-dlp/yt-dlp?tabreadme-ov-file)1)使用Pycharm(2024.3)进行代码…...

Python + 深度学习从 0 到 1(00 / 99)
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 什么是深度学习? 人工智能、机器学习与…...

单点登录深入详解之设计方案总结
基于cookie的单点登录解决方案 概述 用户登录之后 , 将认证信息存储至 Cookie ,当再次访问本服务或者访问其他应用服务时,直接从 Cookie 中传递认证信息,进行鉴权处理。 问题 1. 如何保障Cookie内用户认证信息的安全性? 第一, Cookie…...
Loadsh源码分析-forEach,eachRight,map,flatMap,flatMapDeep,flatMapDepth
处理数组array的函数已经学习完,接下来是collection相关的函数, collection指的是一组用于处理集合(如数组或对象)的工具函数。 lodash源码研读之forEach,forEachRight,map,flatMap,flatMapDeep,flatMapDepth 一、源码地址 GitH…...
检测到“runtimelibrary”的不匹配项: 值“mtd_staticdebug”不匹配值“mdd_dynamic”
1. 解释“runtimelibrary”不匹配错误的含义 在Visual Studio中,LNK2038错误表示链接器检测到项目与其依赖的库之间存在“Runtime Library”(运行时库)的不匹配。具体来说,这意味着编译项目时使用的运行时库类型与编译依赖库时使…...
go clean -modcache命令清理缓存
go clean -modcache命令用于清理Go模块的本地缓存。Go模块缓存位于$GOPATH/pkg/mod/cache目录下,存储了所有下载和使用的模块版本。当执行go clean -modcache时,这个命令会删除该目录下的所有内容,迫使Go在下次构建时重新下载所有依赖的模块。…...

C#结构体排序(数组)
结构体排序(数组) 1 示例1.1 以PointF为例展示效果1.2 运行结果展示 2实际运用2.1 创建结构体2.2 调用示例2.3 运行结果展示 1 示例 1.1 以PointF为例展示效果 private void button1_Click(object sender, EventArgs e) {Random random new Random();…...

基于边缘智能网关的机房安全监测应用
随着我国工业互联网的扎实推进,越来越多地区积极建设信息基础设施,以充沛算力支撑产业物联网的可持续发展,数据机房就是其中的典型代表。而且随着机房规模的扩大,对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…...

【Jenkins】自动化部署 maven 项目笔记
文章目录 前言1. Jenkins 新增 Maven 项目2. Jenkins 配置 Github 信息3. Jenkins 清理 Workspace4. Jenkins 配置 后置Shell脚本后记 前言 目标:自动化部署自己的github项目 过程:jenkins 配置、 shell 脚本积累 相关连接 Jenkins 官方 docker 指导d…...
LeetCode 3243. Shortest Distance After Road Addition Queries I
🔗 https://leetcode.com/problems/shortest-distance-after-road-addition-queries-i 题目 有 n 个城市,编号 0 ~ n-1,从城市 i 到 i1 有一条路给若干高速路,表明从城市 u 到 v 有一条新增的路,v - u > 1返回每新…...

ML 系列:第 31 节— 机器学习中的协方差和相关性
文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 (有关详细信息)3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…...

【鸿蒙】鸿蒙开发过程中this指向问题
文章目录 什么是 this?常见 this 指向问题案例分析:HarmonyOS 组件中的 this 指向问题问题描述问题分析原因 解决方案:绑定 this 的正确方法方法一:使用箭头函数方法二:手动绑定 this 完整代码示例使用箭头函数使用 bi…...

d3-contour 生成等高线图
D3.js 是一个强大的 JavaScript 库,用于创建动态、交互式数据可视化。d3-contour 是 D3.js 的一个扩展模块,用于生成等高线图(contour plots)。 属性和方法 属性 x: 一个函数,用于从数据点中提取 x 坐标。y: 一个函…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...