.NET Core3.1编写混合C++程序
前言
随着.NETCore3.1的第二个预览版本发布,微软正式将C++/CLI移植到.NETCore上,从此可以使用C++编写.NETCore的程序了。
由于目前仅有MSVC支持编译此类混合代码,并且由于涉及到非托管代码,因此C++/CLI目前不能跨平台,只支持Windows。
如果需要跨平台,除了微软的工作之外,还另外需要gcc/clang大量跟进,工作量较大且进度不可控,目前微软暂无使C++/CLI跨平台的计划。
先决条件
VisualStudio201916.4preview3
.NETCoreSDK3.1preview2
开启方法
运行VisualStudioInstaller,安装“使用C++的桌面开发”和“.NETCore跨平台开发”工作负载,然后再在单个组件中勾选“对v142生成工具(14.24)的C++/CLI支持”。
等待安装完毕,启动VisualStudio,新建项目的时候即可看见两个新增的项目模板:
- CLRClassLibrary(.NETCore)
- CLREmptyProject(.NETCore)
第一个项目
我们选择CLREmptyProject(.NETCore)创建我们的第一个C++/CLI项目,然后在右侧解决方案管理器的源文件(SourceFiles)处右键添加C++源文件main.cpp。
然后我们即可使用C++编写.NETCore程序。
添加以下代码:
运行程序,输入helloworld后回车:
可以看到我们成功的运行了程序并且完成了C++代码与.NETCore的无缝交互。
注意点
- 托管堆对象的创建使用gcnew,而不是new
- 托管堆对象指针的类型为T^,而不是T*,以上述代码为例,str_managed的类型为System::String^。得益于C++11开始有的类型自动推导,我们可以直接使用auto代替显示类型声明,类似C#中的var。
- 使用::代替.访问namespace和class/struct,使用->代替.访问对象中的成员。
- 使用refclass/refstruct定义.NET引用类型,使用valueclass/valuestruct定义.NET值类型。
- 使用interfaceclass/interfacestruct定义接口。
- 使用property定义属性。
- C++/CLI项目可以引用任何的C++项目或动态链接库,但是要确保架构相同,即你不能用x86的配置引用x64架构下的非托管代码。
添加项目引用并使用
对于引用C++代码,在此不进行赘述,使用方式和正常的C++项目没有任何区别。因此在这里只说如何引用.NET程序集。
我们可以直接添加对.NETStandard/.NETCorelibrary的引用。如果出现无法使用nuget包管理器安装的情况,可以手动下载对应的.NET程序集dll然后添加到项目引用当中。这里以Newtonsoft.Json为例。
首先添加引用
然后我们就能使用啦!
然后我们编写一个.NET类型,为了展示的更完整,我们采用完整的属性书写方法,而不是自动属性。
然后我们构建一段json字符串,试试用Newtonsoft.Json解序列化。
运行,输出:
后记
虽然C++/CLI暂时不能跨平台,但是对.NETCore的支持极大的丰富了.NETCore的适用范围,可以用于编写高性能的C++程序的同时,享受来自C++和.NETCore/.NETStandard的全部生态。
对于编写Windows程序,C++/CLI绝对值得一试。而关于跨平台的问题,说不定后面的版本微软就支持了呢?要知道,两年前C++/CLI在.NETCore上运行微软给的回复也是“没有计划”,然而如今却顺利的完整支持了。
对于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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。