当前位置: 首页 > news >正文

【C++】托管类和托管函数

托管类和托管函数

1. 托管类

托管类是指在 .NET 环境中运行的类,它们由公共语言运行时(CLR)管理。托管类具有以下特点:

  • 自动内存管理:托管类的实例由 CLR 的垃圾回收机制管理,自动处理内存的分配和释放。
  • 类型安全:CLR 提供类型检查,确保代码在运行时不会引发类型错误。
  • 跨语言互操作性:托管类可以被多种 .NET 支持的语言(如 C#、VB.NET、F# 等)调用。
2. 托管函数

托管函数是定义在托管类中的函数,这些函数同样由 CLR 管理。托管函数通常可以访问托管环境的特性,如自动内存管理和异常处理。

如何使用托管类和托管函数

在 C++/CLI 中,定义托管类和托管函数非常简单。以下是一个简单的实践例子。

实践例子

1. 创建一个托管类(C++/CLI)

我们创建一个简单的托管类 Calculator,它提供一个托管函数 Add 用于执行加法运算。

// Calculator.h
#pragma oncepublic ref class Calculator {
public:// 托管函数,执行加法int Add(int a, int b) {return a + b; // 返回两数之和}
};
补充:

在 C++/CLI 中,public ref class::Add 的含义如下:

1. ref
  • ref 是 C++/CLI 中用于定义托管类的关键字。它表示该类是在 .NET 环境中运行的,具有垃圾回收、类型安全等特性。托管类可以被 .NET 框架和其他托管代码使用。
  • ref 相对的是 value,用于定义值类型(结构体)。
2. ::Add()
  • :: 是 C++ 的作用域解析运算符,用于指定名称空间或类的作用域。在这里,它用于调用全局作用域中的 Add 函数。
  • 当你使用 ::Add(a, b) 时,表示你要调用的是定义在全局作用域的 Add 函数,而不是可能在类或命名空间中重定义的同名函数。
小结
  • ref 表示该类是一个托管类,运行在 .NET 环境中。
  • :: 用于指定作用域,以调用全局的 Add 函数,确保不与其他同名函数发生冲突。
2. 创建一个 C# 应用程序

接下来,我们在 C# 应用程序中使用这个托管类。

// Program.cs
using System;class Program
{static void Main(){// 创建 Calculator 类的实例Calculator calc = new Calculator();// 调用托管函数 Addint result = calc.Add(5, 7);// 输出结果Console.WriteLine("The result of adding 5 and 7 is: " + result);}
}

编译和运行

  1. 编译 C++/CLI 代码:将 Calculator.h 和相应的实现文件编译为 DLL。
  2. 引用 DLL:在 C# 项目中引用生成的 DLL。
  3. 运行 C# 程序:执行 C# 程序,它将调用托管类的托管函数,输出结果。

总结

  • 托管类 是在 .NET 环境中运行的类,由 CLR 进行管理,支持自动内存管理和类型安全。
  • 托管函数 是定义在托管类中的函数,可以访问托管环境的特性。
  • 在 C++/CLI 中创建托管类和函数后,可以通过 C# 等其他语言方便地调用它们,利用 .NET 平台的强大功能。

相关文章:

  • jenkins分布式构建
  • C高级(Day21)
  • XPath基础知识点讲解——用于在XML中查找信息的语言
  • [vulnhub] Jarbas-Jenkins
  • numpy is not available
  • 982. 按位与为零的三元组
  • UI设计师面试整理-工具和技术技能
  • list(二) (list模拟实现)
  • HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南
  • CANopen开源库canfestival的移植
  • 深度解析APP软件开发:构建卷轴式分销系统的实践探索
  • 一个PDF样本册免费上传网站
  • 【HTTP 和 HTTPS详解】3
  • 【PAM】Linux登录认证限制
  • 前后端传参
  • [译] 怎样写一个基础的编译器
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • idea + plantuml 画流程图
  • JavaScript服务器推送技术之 WebSocket
  • PermissionScope Swift4 兼容问题
  • Selenium实战教程系列(二)---元素定位
  • SpingCloudBus整合RabbitMQ
  • spring boot 整合mybatis 无法输出sql的问题
  • vuex 笔记整理
  • 从0实现一个tiny react(三)生命周期
  • 反思总结然后整装待发
  • 工作中总结前端开发流程--vue项目
  • 简单数学运算程序(不定期更新)
  • 两列自适应布局方案整理
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 我这样减少了26.5M Java内存!
  • 学习JavaScript数据结构与算法 — 树
  • 阿里云重庆大学大数据训练营落地分享
  • "无招胜有招"nbsp;史上最全的互…
  • # Panda3d 碰撞检测系统介绍
  • $.ajax()方法详解
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (pojstep1.3.1)1017(构造法模拟)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (七)Java对象在Hibernate持久化层的状态
  • (七)理解angular中的module和injector,即依赖注入
  • (三)uboot源码分析
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转载)利用webkit抓取动态网页和链接
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net core 6.0 升8.0
  • .NET CORE Aws S3 使用
  • .Net Winform开发笔记(一)
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 使用 XPath 来读写 XML 文件
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NET程序员迈向卓越的必由之路
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET正则基础之——正则委托