前言
随着 .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 Empty Project (.NET Core) 创建我们的第一个 C++/CLI 项目,然后在右侧解决方案管理器的源文件(Source Files) 处右键添加 C++ 源文件 main.cpp。
然后我们即可使用 C++ 编写 .NET Core 程序。
添加以下代码:
运行程序,输入 hello world 后回车:
可以看到我们成功的运行了程序并且完成了 C++ 代码与 .NET Core 的无缝交互。
注意点
添加项目引用并使用
对于引用 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍C和C++混合编程问题,包括了C和C++混合编程问题的使用技巧和注意事项,需要的朋友参考一下 分析以下一段代码: 调用以上三个文件,编译通过,但是执行是出现以下问题: obj : error LNK2001: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z) E:\Programming\Grapic\test\Debug\te
FAQs in section [32]: [32.1] 混合C和C++编程时我需要知道什么? [32.2] 如何在C++代码中包含标准的C头文件? [32.3] 如何在C++代码中包含非系统的C头文件? [32.4] 如何修改我自己的C头文件 , 以便更容易的在C++代码中包含他们? [32.5] 如何从C++代码中调用非系统C 函数f(int,char和float)? from my C++
本文向大家介绍BAT与HTML混合编程写法,包括了BAT与HTML混合编程写法的使用技巧和注意事项,需要的朋友参考一下 核心代码
本文向大家介绍python和C语言混合编程实例,包括了python和C语言混合编程实例的使用技巧和注意事项,需要的朋友参考一下 最近为了测试网速情况怎么样,由于部分业务服务器需要关闭icmp,这样的话采用普通的ping就无法适应我的需求,于是自己简单的写了一个基于tcp端口的ping的程序,由于c执行效率比较的不错,但是开发效率低下,而python是开发效率高,但是执行效率不如C,由于需要大规模的
本文向大家介绍Swift、Objective-C、Cocoa混合编程设置指南,包括了Swift、Objective-C、Cocoa混合编程设置指南的使用技巧和注意事项,需要的朋友参考一下 Swift 被设计用来无缝兼容 Cocoa 和 Objective-C 。在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中
混入 混入和函数定义方法一致,但是应用却大相径庭。 例如,下面有定义的border-radius(n)方法,其却作为一个mixin(如,作为状态调用,而非表达式)调用。 当border-radius()选择器中调用时候,属性会被扩展并复制在选择器中。 border-radius(n) -webkit-border-radius n -moz-border-radius n bor