.NET Core3.1編寫混合C++程序
前言
隨著 .NET Core 3.1 的第二個(gè)預(yù)覽版本發(fā)布,微軟正式將 C++/CLI 移植到 .NET Core 上,從此可以使用 C++ 編寫 .NET Core 的程序了。
由于目前僅有 MSVC 支持編譯此類混合代碼,并且由于涉及到非托管代碼,因此 C++/CLI 目前不能跨平臺(tái),只支持 Windows。
如果需要跨平臺(tái),除了微軟的工作之外,還另外需要 gcc/clang 大量跟進(jìn),工作量較大且進(jìn)度不可控,目前微軟暫無(wú)使 C++/CLI 跨平臺(tái)的計(jì)劃。
先決條件
Visual Studio 2019 16.4 preview 3
.NET Core SDK 3.1 preview 2
開啟方法
運(yùn)行 Visual Studio Installer,安裝“使用 C++ 的桌面開發(fā)” 和 “.NET Core 跨平臺(tái)開發(fā)” 工作負(fù)載,然后再在單個(gè)組件中勾選“對(duì) v142 生成工具 (14.24) 的 C++/CLI 支持”。
等待安裝完畢,啟動(dòng) Visual Studio,新建項(xiàng)目的時(shí)候即可看見兩個(gè)新增的項(xiàng)目模板:
- CLR Class Library (.NET Core)
- CLR Empty Project (.NET Core)
第一個(gè)項(xiàng)目
我們選擇 CLR Empty Project (.NET Core) 創(chuàng)建我們的第一個(gè) C++/CLI 項(xiàng)目,然后在右側(cè)解決方案管理器的源文件(Source Files) 處右鍵添加 C++ 源文件 main.cpp。
然后我們即可使用 C++ 編寫 .NET Core 程序。
添加以下代碼:
運(yùn)行程序,輸入 hello world 后回車:
可以看到我們成功的運(yùn)行了程序并且完成了 C++ 代碼與 .NET Core 的無(wú)縫交互。
注意點(diǎn)
- 托管堆對(duì)象的創(chuàng)建使用 gcnew,而不是 new
- 托管堆對(duì)象指針的類型為 T^,而不是 T*,以上述代碼為例,str_managed 的類型為 System::String^。得益于 C++ 11 開始有的類型自動(dòng)推導(dǎo),我們可以直接使用 auto 代替顯示類型聲明,類似 C# 中的 var。
- 使用 :: 代替 . 訪問(wèn) namespace 和 class/struct,使用 -> 代替 . 訪問(wèn)對(duì)象中的成員。
- 使用 ref class/ref struct 定義 .NET 引用類型,使用 value class/value struct 定義 .NET 值類型。
- 使用 interface class/interface struct 定義接口。
- 使用 property 定義屬性。
- C++/CLI 項(xiàng)目可以引用任何的 C++ 項(xiàng)目或動(dòng)態(tài)鏈接庫(kù),但是要確保架構(gòu)相同,即你不能用 x86 的配置引用 x64 架構(gòu)下的非托管代碼。
添加項(xiàng)目引用并使用
對(duì)于引用 C++ 代碼,在此不進(jìn)行贅述,使用方式和正常的 C++ 項(xiàng)目沒(méi)有任何區(qū)別。因此在這里只說(shuō)如何引用 .NET 程序集。
我們可以直接添加對(duì) .NET Standard/.NET Core library 的引用。如果出現(xiàn)無(wú)法使用 nuget 包管理器安裝的情況,可以手動(dòng)下載對(duì)應(yīng)的 .NET 程序集 dll 然后添加到項(xiàng)目引用當(dāng)中。這里以 Newtonsoft.Json 為例。
首先添加引用
然后我們就能使用啦!
然后我們編寫一個(gè) .NET 類型,為了展示的更完整,我們采用完整的屬性書寫方法,而不是自動(dòng)屬性。
然后我們構(gòu)建一段 json 字符串,試試用 Newtonsoft.Json 解序列化。
運(yùn)行,輸出:
后記
雖然 C++/CLI 暫時(shí)不能跨平臺(tái),但是對(duì) .NET Core 的支持極大的豐富了 .NET Core 的適用范圍,可以用于編寫高性能的 C++ 程序的同時(shí),享受來(lái)自 C++ 和 .NET Core/.NET Standard 的全部生態(tài)。
對(duì)于編寫 Windows 程序,C++/CLI 絕對(duì)值得一試。而關(guān)于跨平臺(tái)的問(wèn)題,說(shuō)不定后面的版本微軟就支持了呢?要知道,兩年前 C++/CLI 在 .NET Core 上運(yùn)行微軟給的回復(fù)也是“沒(méi)有計(jì)劃”,然而如今卻順利的完整支持了。
對(duì)于 C++/CLI 的其他地方,可以參考微軟官方文檔,內(nèi)容十分豐富(由于中文文檔存在部分機(jī)器翻譯,建議有能力的朋友直接閱讀英文文檔避免機(jī)器翻譯帶來(lái)的錯(cuò)誤):
https://docs.microsoft.com/zh-cn/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=vs-2019
參考文獻(xiàn)
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:ASP.NET Core 3.0使用gRPC的具體方法
欄 目:ASP.NET
本文標(biāo)題:.NET Core3.1編寫混合C++程序
本文地址:http://mengdiqiu.com.cn/a1/ASP_NET/10822.html
您可能感興趣的文章
- 01-11如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件XRPC詳解
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其妙的超時(shí)
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11ASP.NET Core靜態(tài)文件的使用方法
- 01-11.NET Core 3.0之創(chuàng)建基于Consul的Configuration擴(kuò)展組件
- 01-11.net core EF Core調(diào)用存儲(chǔ)過(guò)程的方式


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-11vscode extension插件開發(fā)詳解
- 01-11VsCode插件開發(fā)之插件初步通信的方法
- 01-11如何給asp.net core寫個(gè)簡(jiǎn)單的健康檢查
- 01-11.net core高吞吐遠(yuǎn)程方法如何調(diào)用組件
- 01-11淺析.Net Core中Json配置的自動(dòng)更新
- 01-11.NET開發(fā)人員關(guān)于ML.NET的入門學(xué)習(xí)
- 01-11.NET Core 遷移躺坑記續(xù)集之Win下莫名其
- 01-11.net core webapi jwt 更為清爽的認(rèn)證詳解
- 01-11docker部署Asp.net core應(yīng)用的完整步驟
- 01-11ASP.NET Core靜態(tài)文件的使用方法
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文