.NET Core 3.1 編寫混合 C++ 程序

前言

隨着 .NET Core 3.1 的第二個預覽版本發佈,微軟正式將 C++/CLI 移植到 .NET Core 上,今後可使用 C++ 編寫 .NET Core 的程序了。json

因爲目前僅有 MSVC 支持編譯此類混合代碼,而且因爲涉及到非託管代碼,所以 C++/CLI 目前不能跨平臺,只支持 Windows。架構

若是須要跨平臺,除了微軟的工做以外,還另外須要 gcc/clang 大量跟進,工做量較大且進度不可控,目前微軟暫無使 C++/CLI 跨平臺的計劃。工具

先決條件

Visual Studio 2019 16.4 preview 3性能

.NET Core SDK 3.1 preview 2spa

開啓方法

運行 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 程序。blog

添加如下代碼:接口

運行程序,輸入 hello world 後回車:

 

 

能夠看到咱們成功的運行了程序而且完成了 C++ 代碼與 .NET Core 的無縫交互。

 

注意點

  1. 託管堆對象的建立使用 gcnew,而不是 new
  2. 託管堆對象指針的類型爲 T^,而不是 T,以上述代碼爲例,str_managed 的類型爲 System::String^。得益於 C++ 11 開始有的類型自動推導,咱們能夠直接使用 auto 代替顯示類型聲明,相似 C# 中的 var。
  3. 使用 :: 代替 . 訪問 namespace 和 class/struct,使用 -> 代替 . 訪問對象中的成員。
  4. 使用 ref class/ref struct 定義 .NET 引用類型,使用 value class/value struct 定義 .NET 值類型。
  5. 使用 interface class/interface struct 定義接口。
  6. 使用 property 定義屬性。
  7. 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

相關文章
相關標籤/搜索