这篇文章主要介绍了.NET Core3.1编写混合C++程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

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

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

先决条件

Visual Studio 2019 1 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 的无缝交互。

注意点

    托管堆对象的创建使用 gcnew,而不是 new 托管堆对象指针的类型为 T^,而不是 T*,以上述代码为例,str_managed 的类型为 System::String^。得益于 C++ 11 开始有的类型自动推导,我们可以直接使用 auto 代替显示类型声明,类似 C# 中的 var。 使用 :: 代替 . 访问 namespace 和 class/struct,使用 -> 代替 . 访问对象中的成员。 使用 ref class/ref struct 定义 .NET 引用类型,使用 value class/value struct 定义 .NET 值类型。 使用 interface class/interface struct 定义接口。 使用 property 定义属性。 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持爱安网。

最新资讯
特斯拉频繁裁员让员工没有安全感:像斧子悬在头上

特斯拉频繁裁员让员工

据国外媒体报道,多名特斯拉员工表示,频繁的裁员让他们感
小红书回应部分用户App访问故障:技术原因 已恢复

小红书回应部分用户Ap

7月6日晚间,部分用户发现小红书移动端App苹果和安卓系
蔚来涨幅扩大至26.65% 二季度交付10331辆汽车超预期

蔚来涨幅扩大至26.65%

蔚来汽车二季度交付了10331辆汽车,超出了此前预期上限
亚马逊和英伟达也卷入“反性骚扰运动” 150多人涉案

亚马逊和英伟达也卷入

越来越多的美国大品牌卷入到了正席卷美国游戏直播界的
蔚来汽车涨逾20% 股价突破11美元关口

蔚来汽车涨逾20% 股价

蔚来汽车涨逾20%,股价突破11美元关口,创2019年3月上旬以
美的:格力所提及中移动项目发票及技术存疑均不属实

美的:格力所提及中移动

美的官方微博发表声明表示:格力所提及在中国移动招标项
最新文章
用.NET做动态域名解析的方法示例

用.NET做动态域名解析

这篇文章主要介绍了用.NET做动态域名解析的方法示例,文
.NET Core3.1编写混合C++程序

.NET Core3.1编写混合

这篇文章主要介绍了.NET Core3.1编写混合C++程序,文中
ASP.NET Core 3.0使用gRPC的具体方法

ASP.NET Core 3.0使用

这篇文章主要介绍了ASP.NET Core 3.0使用gRPC,文中通过
ASP.NET Core 3.0 gRPC拦截器的使用

ASP.NET Core 3.0 gRP

这篇文章主要介绍了ASP.NET Core 3.0 gRPC拦截器的使
ASP.NET Core 3框架揭秘之 异步线程无法使用IServiceProvider问题

ASP.NET Core 3框架揭

这篇文章主要介绍了ASP.NET Core 3框架揭秘之异步线程
3分钟快速学会在ASP.NET Core MVC中如何使用Cookie

3分钟快速学会在ASP.N

这篇文章主要给大家介绍了关于如何通过3分钟快速学会