.NET Core3.1编写混合C++程序
更新时间:2019年12月23日 14:29:42 作者:hez2010
这篇文章主要介绍了.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 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 的无缝交互。
注意点
托管堆对象的创建使用 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 的其他地方,可以参考微软官方文档,内容十分丰富(由于中文文档存在部分机器翻译,建议有能力的朋友直接阅读英文文档避免机器翻译带来的错误):
docs.microsoft.com/zh-cn/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=vs-2019
参考文献
devblogs.microsoft.com/dotnet/announcing-net-core-3-1-preview-2/
devblogs.microsoft.com/cppblog/an-update-on-cpp-cli-and-dotnet-core/
docs.microsoft.com/zh-cn/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=vs-2019
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。
您可能感兴趣的文章:在C++中反射调用.NET的方法(一)在C++中反射调用.NET的方法(二)在C++中反射调用.NET的方法(三)
.NET
Core
混合
C++
相关文章
.Net RabbitMQ实现HTTP API接口调用RabbitMQ Management插件还提供了基于RESTful风格的HTTP API接口来方便调用。本文就主要介绍了.Net RabbitMQ实现HTTP API接口调用,感兴趣的可以了解一下 2021-06-06
CKEditor自定义按钮插入服务端图片这篇文章主要为大家详细介绍了CKEditor自定义按钮插入服务端图片的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-06-06
asp.net开发微信公众平台之验证消息的真实性这篇文章主要介绍了asp.net开发微信公众平台之验证消息的真实性的相关资料,需要的朋友可以参考下 2015-06-06
为GridView的行添加鼠标经过、点击事件的小例子这篇文章介绍了GridView的行添加鼠标经过、点击事件的小例子,有需要的朋友可以参考一下 2013-11-11
ASP.NET控件10个最有用的属性详解ASP.NET控件10个最有用的属性详解,学习.net的朋友可以参考下。 2011-09-09
MVC异常处理详解这篇文章主要为大家详细介绍了MVC异常处理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2017-06-06
Asp.net调试的一些问题小结这篇文章主要介绍了asp.net调试方便的知识点,在CSDN找了一些相关的解决方法,不敢独享,供大家相互学习交流之用 2013-11-11
ASP.NET编程获取网站根目录方法小结这篇文章主要介绍了ASP.NET编程获取网站根目录方法,较为详细的分析了ASP.NET针对网站目录及物理路径的操作技巧,并给出了实例予以总结,需要的朋友可以参考下 2015-11-11
ASP.NET对HTML页面元素进行权限控制(一)界面每个元素的权限也是需要控制的。比如一个查询用户的界面里面有查询用户按钮,添加用户按钮,删除用户按钮,不同的角色我们得分配不同的权限 2013-12-12
c#.net全站防止SQL注入类的代码c#.net全站防止SQL注入类的代码,需要的朋友可以参考一下 2013-03-03
最新评论

评论(0)