前言

随着 .NET Core 3.1 的第二个预览版本发布,微软正式将 C++/CLI 移植到 .NET Core 上,从此可以使用 C++ 编写 .NET Core 的程序了。

由于目前仅有 MSVC 支持编译此类混合代码,并且由于涉及到非托管代码,因此 C++/CLI 目前不能跨平台,只支持 Windows。

如果需要跨平台,除了微软的工作之外,还另外需要 gcc/clang 大量跟进,工作量较大且进度不可控,目前微软暂无使 C++/CLI 跨平台的计划。

先决条件

Visual Studio 2019 16.4 preview 3

.NET Core SDK 3.1 preview 2

开启方法

运行 Visual Studio Installer,安装“使用 C++ 的桌面开发” 和 “.NET Core 跨平台开发” 工作负载,然后再在单个组件中勾选“对 v142 生成工具 (14.24) 的 C++/CLI 支持”。

等待安装完毕,启动 Visual Studio,新建项目的时候即可看见两个新增的项目模板:

  • CLR Class Library (.NET Core)

  • CLR Empty Project (.NET Core)

第一个项目

我们选择 CLR Empty Project (.NET Core) 创建我们的第一个 C++/CLI 项目,然后在右侧解决方案管理器的源文件(Source Files) 处右键添加 C++ 源文件 main.cpp。

然后我们即可使用 C++ 编写 .NET Core 程序。

添加以下代码:

运行程序,输入 hello world 后回车:

可以看到我们成功的运行了程序并且完成了 C++ 代码与 .NET Core 的无缝交互。

注意点

  1. 托管堆对象的创建使用 gcnew,而不是 new

  2. 托管堆对象指针的类型为 T^,而不是 T*,以上述代码为例,str_managed 的类型为 System::String^。得益于 C++ 11 开始有的类型自动推导,我们可以直接使用 auto 代替显示类型声明,类似 C# 中的 var。

  3. 使用 :: 代替 . 访问 namespace 和 class/struct,使用 -> 代替 . 访问对象中的成员。

  4. 使用 ref class/ref struct 定义 .NET 引用类型,使用 value class/value struct 定义 .NET 值类型。

  5. 使用 interface class/interface struct 定义接口。

  6. 使用 property 定义属性。

  7. C++/CLI 项目可以引用任何的 C++ 项目或动态链接库,但是要确保架构相同,即你不能用 x86 的配置引用 x64 架构下的非托管代码。

添加项目引用并使用

对于引用 C++ 代码,在此不进行赘述,使用方式和正常的 C++ 项目没有任何区别。因此在这里只说如何引用 .NET 程序集。

我们可以直接添加对 .NET Standard/.NET Core library 的引用。如果出现无法使用 nuget 包管理器安装的情况,可以手动下载对应的 .NET 程序集 dll 然后添加到项目引用当中。这里以 Newtonsoft.Json 为例。

首先添加引用

然后我们就能使用啦!

然后我们编写一个 .NET 类型,为了展示的更完整,我们采用完整的属性书写方法,而不是自动属性。

然后我们构建一段 json 字符串,试试用 Newtonsoft.Json 解序列化。

运行,输出:

后记 

虽然 C++/CLI 暂时不能跨平台,但是对 .NET Core 的支持极大的丰富了 .NET Core 的适用范围,可以用于编写高性能的 C++ 程序的同时,享受来自 C++ 和 .NET Core/.NET Standard 的全部生态。

对于编写 Windows 程序,C++/CLI 绝对值得一试。而关于跨平台的问题,说不定后面的版本微软就支持了呢?要知道,两年前 C++/CLI 在 .NET Core 上运行微软给的回复也是“没有计划”,然而如今却顺利的完整支持了。

对于 C++/CLI 的其他地方,可以参考微软官方文档,内容十分丰富(由于中文文档存在部分机器翻译,建议有能力的朋友直接阅读英文文档避免机器翻译带来的错误):

https://docs.microsoft.com/zh-cn/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=vs-2019

参考文献

https://devblogs.microsoft.com/dotnet/announcing-net-core-3-1-preview-2/

https://devblogs.microsoft.com/cppblog/an-update-on-cpp-cli-and-dotnet-core/

https://docs.microsoft.com/zh-cn/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=vs-2019

原文链接:https://www.cnblogs.com/hez2010/p/11810683.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.NET Core 3.1 编写混合 C++ 程序相关推荐

  1. .net core i上 K8S(六).netcore程序的service网络代理模式

    正文 上一章我们讲了pod的hostip模式,但在生产环境中,我们都是通过service来访问k8s集群的,service有两种模式来暴漏端口,今天我们来分享一下 1.clusterIP模式 我们在创 ...

  2. 编写start脚本程序_使用可编写脚本的终结点遍历REST应用程序

    编写start脚本程序 我喜欢JDK附带ScriptEngine的事实. 当您要评估服务器环境中已经部署的应用程序并进行故障排除时,它非常灵活. 将此REST端点添加到Java EE应用程序中,它将使 ...

  3. 如何在C中纯粹编写iOS应用程序

    本文翻译自:How to write iOS app purely in C I read here Learn C Before Objective-C? 我在这里读到在Objective-C之前学 ...

  4. 用keil编写C语言流水灯程序,简述关于Keil、STM32 用C++编写流水灯程序

    通常来说,在单片机上编程,要么汇编,要么C语言,而用C++++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil.STM32,用C++编写流水灯程序的一些内容 ...

  5. cqh-class 文件内容,类加载过程,编写第一个程序

    文章目录 2. 编写第一个程序 2.1 编写源代码并运行 2.1.1 创建 .java 文件编写源码 2.1.2 配置环境变量 2.1.3 解释代码含义 2.1.4 编译与运行 2.2 class 文 ...

  6. SitePoint Podcast#116:混合应用程序与John Allsopp一起获得BS

    Episode 116 of The SitePoint Podcast is now available! This week Louis Simoneau (@rssaddict) talks w ...

  7. 基于Keil、STM32,用C++编写流水灯程序

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | 嵌入式专栏 通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发 ...

  8. Windows下Qt编写Android应用程序的环境搭建记录

    目录 前言 配置开发环境 安装JDK1.8 安装SDK 安装NDK Qt配置OpenCV C++&Java混合编程 结语 前言 由于要在手机上实现一些应用,例如部署目标检测模型.添加单目测距定 ...

  9. windows平台上编写的python无法在unix_【判断题】在Windows平台上编写的Python程序无法在Unix平台运行...

    [判断题]在Windows平台上编写的Python程序无法在Unix平台运行 更多相关问题 分别将下列物质滴入苯酚溶液中,产生白色沉淀的是A.浓溴水B.氢氧化钠溶液C.稀盐酸D.氯化铁溶液 有机物分子 ...

最新文章

  1. iView -- TimePicker 自定义修改时间选择器选择时间面板样式
  2. 容器中的JVM资源该如何被安全的限制?
  3. 网页计算器源php代码,计算器网页版源代码
  4. java 非法字符u3000_IDEA编码格式问题:Error:(3, 13) java: 非法字符: '\u0000'
  5. 轻量级的c语言开发环境搭建,win下轻量级的c语言开发环境配置:vsc + gcc
  6. java 正则表达式提取价格
  7. oracle日志文件大小规则,修改oracle日志文件大小
  8. 小程序promise封装post请求_Promise封装微信小程序的Request请求
  9. HTML期末学生大作业-乒乓球网页作业html+css+javascript
  10. 速成pytorch学习——3天自动微分机制
  11. oracle临时表经常被锁_这是一篇长篇入门级数据库讲解:oracle数据库数据导入导出步骤
  12. linux下 使用apache2 ab 测试进行压力测试
  13. 麻瓜编程python web百度网盘_麻瓜编程_Python Web开发工程师_附课程配套资料
  14. html 选择列表框,列表框的selected属性
  15. Java中重载和重写的区别
  16. photoshop中如何在6寸相纸上打印1寸照片12张3X4模式(手动拖动模式)
  17. 借力函数计算 FC,HEROZ 打造专业级 AI 日本将棋服务
  18. android 屏幕没反应了,手机屏幕失灵了怎么办?安卓手机屏幕失灵解决方法
  19. 如何卸载avast free antivirus软件?
  20. 计算机excel操作教程,Excel操作教程 -电脑资料

热门文章

  1. Winform开发中另一种样式的OutLookBar工具条
  2. facebook 邀请好友_如何在Facebook上与某人解除好友
  3. 如何在Windows中快速轻松地将文件发送到SkyDrive
  4. linux 基准测试_如何对Linux系统进行基准测试:3个开源基准测试工具
  5. [转载]C/C++框架和库
  6. 网站常见漏洞-- XSS攻击
  7. openssh登陆时提示服务器拒绝了密码
  8. Idea maven项目不能新建package和class的解决
  9. Composer快速入门
  10. 2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级