2018璧涘涓婃捣c :.NET Core3.1編寫混合C++程序

cba广东队赛程 www.axwwg.com  更新時間:2020-01-25 00:02:35   作者:佚名   我要評論(0)

前言
隨著 .NET Core 3.1 的第二個預覽版本發布,微軟正式將 C++/CLI 移植到 .NET Core 上,從此可以使用 C++ 編寫 .NET Core 的程序了。
由于目前僅有 MSVC 支持編

前言

隨著 .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 的無縫交互。

注意點

  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

參考文獻

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++中反射調用.NET的方法(一)
  • 在C++中反射調用.NET的方法(二)
  • 在C++中反射調用.NET的方法(三)

相關文章

  • .NET Core3.1編寫混合C++程序

    .NET Core3.1編寫混合C++程序

    前言 隨著 .NET Core 3.1 的第二個預覽版本發布,微軟正式將 C++/CLI 移植到 .NET Core 上,從此可以使用 C++ 編寫 .NET Core 的程序了。 由于目前僅有 MSVC 支持編
    2020-01-25
  • ASP.NET Core 3.0使用gRPC的具體方法

    ASP.NET Core 3.0使用gRPC的具體方法

    一.簡介 gRPC 是一個由Google開源的,跨語言的,高性能的遠程過程調用(RPC)框架。 gRPC使客戶端和服務端應用程序可以透明地進行通信,并簡化了連接系統的構建。它
    2020-01-25
  • ASP.NET Core 3.0 gRPC攔截器的使用

    ASP.NET Core 3.0 gRPC攔截器的使用

    一. 前言 前面兩篇文章給大家介紹了使用gRPC的入門以及雙向流的使用,今天介紹的是gRPC中的攔截器。攔截器就像MVC的過濾器或者是ASP.NET Core middleware 一樣,具有
    2020-01-25
  • ASP.NET MVC中使用log4net的實現示例

    ASP.NET MVC中使用log4net的實現示例

    今天自己要弄一個日志記錄功能,以前也弄過 但是都忘了,今天又弄了一下 花了幾十分鐘,在此記錄一下 第一步:添加log4net.dll 第二步:配置 示例如下: 我是直接配
    2020-01-25
  • 3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    3分鐘快速學會在ASP.NET Core MVC中如何使用Cookie

    一.Cookie是什么? 我的朋友問我cookie是什么,用來干什么的,可是我居然無法清楚明白簡短地向其闡述cookie,這不禁讓我陷入了沉思:為什么我無法解釋清楚,我對
    2020-01-25
  • ASP.Net Core3.0中使用JWT認證的實現

    ASP.Net Core3.0中使用JWT認證的實現

    JWT認證簡單介紹 關于Jwt的介紹網上很多,此處不在贅述,我們主要看看jwt的結構。 JWT主要由三部分組成,如下: HEADER.PAYLOAD.SIGNATURE HEADER 包含token的元
    2020-01-25
  • DataReader不能使用using的詳細示例

    DataReader不能使用using的詳細示例

    本文介紹了DataReader不能使用using的詳細示例,分享給大家,具有如下: public static MySqlDataReader ExecuteMySqlReader(string sqlStr) { MySqlConnection c
    2020-01-25
  • asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net MVC 在Controller控制器中實現驗證碼輸出功能

    asp.net mvc項目使用到驗證碼,為了讓以前的WebForm代碼能利用上代碼經過稍微的改動即可使用代碼如下: using System; using System.Collections.Generic; usin
    2020-01-25
  • 淺談.Net Core 認證系統源碼解析

    淺談.Net Core 認證系統源碼解析

    不知不覺.Net Core已經推出到3.1了,大多數以.Net為技術棧的公司也開始逐步的切換到了Core,從業也快3年多了,一直堅持著.不管環境怎么變,堅持自己的當初的選擇,堅持信
    2020-01-25
  • .NET連接池的問題詳解

    .NET連接池的問題詳解

    NET 連接池救生員 防止可淹沒應用程序的池溢出 William Vaughn 大多數 ADO.NET 數據提供程序使用連接池,以提高圍繞 Microsoft 斷開連接的 .NET 結構構建的應用程序
    2020-01-25

最新評論