前言

随着 .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 上运行微软给的回复也是“没有计划”,然而如今却顺利的完整支持了。

  • CLR Class Library (.NET Core)
  • CLR Empty Project (.NET Core)

.NET Core 3.1 编写混合 C++ 程序的更多相关文章

  1. 分别在.NET Framework 与 .NET Core 框架下 编写Windows Service(windows服务程序)

    前言,为什么会分别在两个框架下编写Windows Service,是因为最近在做区块链这块,使用的是NEO(小蚁区块链)的相关技术,NEO使用的是.net core 2.1,业务上需要写两个程序,一个 ...

  2. 基于php基础语言编写的小程序之计算器

    基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...

  3. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,

    编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...

  4. 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...

  5. 【C++】第1章 在VS2015中用C++编写控制台应用程序

    分类:C++.VS2015 创建日期:2016-06-12 一.简介 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了.这里仅介绍学习C++时推荐使用的两种开发 ...

  6. 使用PHP编写发红包程序

    使用PHP编写发红包程序 http://www.jb51.net/article/69815.htm 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-07-22   微信发红 ...

  7. 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法

    问题: 在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行.双击提示: "无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题 ...

  8. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  9. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

随机推荐

  1. Winows 2008远程桌面访问多用户设置

    一张图

  2. RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?

    目录 RocketMQ 源码学习笔记----Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest ...

  3. Windows下IIS搭建Ftp服务器

    第一步:启用Windows IIS Web服务器 1.1 控制面板中找到"程序"并打开 1.2 程序界面找到"启用或关闭Windows功能"并打开 1.3 上面 ...

  4. Linux 命令个人笔记

    [表示命令]man -f [] 显示一个命令的功能whatis [] 显示一个命令的功能ls -lR | grep '^-' | wc -l 统计一个目录下总共有多少个文件head [-n numbe ...

  5. Rust入坑指南:核心概念

    如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...

  6. Windows中0环与3环通信(常规方式)

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.知识点讲解 1. 设备对象 我们在开发窗口程序的时候,消息被封 ...

  7. Cocos2d-x入门之旅[1]场景

    在游戏开发过程中,你可能需要一个主菜单,几个关卡和一个END的界面,如何组织管理这些东西呢? 和其他游戏引擎类似,Cocos也使用了场景(Scene) 这个概念 试想象一部电影或是番剧,你不难发现它是 ...

  8. BZOJ 4392 卡牌游戏

    Description 奶牛贝茜是卡牌游戏的狂热爱好者, 但是令人吃惊的, 她缺乏对手. 不幸的是, 任何牧 群里的其他牛都不是好对手. 他们实在是太差了 , 实际上, 他们玩卡牌游戏时会遵循一种完全 ...

  9. 使用malloc函数或new运算符为链表结点分配内存空间

    目录 使用malloc函数或new运算符为链表结点分配内存空间 使用malloc函数或new运算符为链表结点分配内存空间 当我们定义链表结点类型后,如何在每次需要使用新结点时临时分配相应大小的内存空间 ...

  10. [CF431C]k-Tree

    题目描述 Quite recently a creative student Lesha had a lecture on trees. After the lecture Lesha was ins ...