C++/WinRT 是適用於 Windows 執行階段 (WinRT) API 的完全標準新式 C++17 語言投射,實作為標頭檔案為基礎的函式庫,並設計為為您提供新式 Windows API 的一級存取。 透過 C++/WinRT,您可以使用任何符合標準的 C++17 編譯程式來撰寫及取用 Windows 運行時間 API。 Windows SDK 包含 C++/WinRT;它於 10.0.17134.0 版中引進(Windows 10 版本 1803)。
C++/WinRT 是Microsoft建議用來取代C++/CX語言投影,以及Windows執行階段C++範本庫(WRL)的方案。 C++/WinRT 的
這很重要
一些最重要的 C++/WinRT 元素包括 SDK 對 C++/WinRT 的支援,以及 Visual Studio 對 C++/WinRT、XAML、VSIX 擴充功能和 NuGet 套件的支援。
另請參閱 哪裡可以找到C++/WinRT 範例應用程式?。
語言預測
Windows 執行平台是以元件物件模型(COM)API 為基礎,設計成可透過 語言投影來存取。 投影會隱藏 COM 詳細數據,併為指定的語言提供更自然的程式設計體驗。
Windows 執行階段 API 參考內容中的 C++/WinRT 語言投影
當您流覽 Windows Runtime API時,請按一下右上角的 [語言] 下拉式方塊,然後選取 [C++/WinRT],以查看以 C++/WinRT 語言表示的 API 語法區塊。
Visual Studio 對 C++/WinRT、XAML、VSIX 延伸模組和 NuGet 套件的支援
針對 Visual Studio 支援,您將需要 Visual Studio 2022 或 Visual Studio 2019 或 Visual Studio 2017(至少 15.6 版;我們建議至少 15.7 版)。 從 Visual Studio 安裝程式內,安裝 通用 Windows 平台開發 工作負載。 在 安裝詳細資料>通用 Windows 平台開發中,如果您尚未這麼做,請檢查 C++ (v14x) 通用 Windows 平台工具 選項。 此外,在 Windows 設定>隱私權與安全性 (Windows 10: Update & Security) >中,為開發人員啟用開發人員 模式 選項 (Windows 10:不是 側載應用程式 選項)。
雖然我們建議您使用最新版本的 Visual Studio 和 Windows SDK 進行開發, 如果您使用 10.0.17763.0 之前隨附於 Windows SDK 的 C++/WinRT 版本(Windows 10 版本 1809),則若要使用上述 Windows 命名空間標頭,則您的專案中需要最低 Windows SDK 目標版本 10.0.17134.0 (Windows 10, 版本 1803)。
Visual Studio 2022 隨附了內建的 C++/WinRT 專案和項目範本,讓您可以立即開始 C++/WinRT 開發。 它也隨附 Visual Studio 原生偵錯視覺效果 (natvis) 以支援 C++/WinRT 投影類型,提供類似於 C# 偵錯的體驗。 Natvis 會自動進行偵錯組建。 如需詳細資訊,請參閱 C++/WinRT的 Visual Studio 原生偵錯視覺效果。
針對舊版 Visual Studio,您會想要 從 Visual Studio Marketplace下載並安裝最新版本的 C++/WinRT Visual Studio 擴充功能 (VSIX)。
- VSIX 擴充功能可在 Visual Studio 中為您提供 C++/WinRT 專案和項目範本。
- 此外,它提供 Visual Studio 原生偵錯視覺化功能(natvis),以顯示 C++/WinRT 的投影類型。
下列各節將說明適用於 C++/WinRT 的 Visual Studio 專案範本。 當您建立已安裝最新版 VSIX 延伸模組的新 C++/WinRT 專案時,新的 C++/WinRT 專案會自動安裝 Microsoft.Windows.CppWinRT NuGet 套件。 Microsoft.Windows.CppWinRT NuGet 套件提供C++/WinRT 組建支援(MSBuild 屬性和目標),讓您的專案在開發機器與組建代理程式之間可移植(只有 NuGet 套件,而不是 VSIX 延伸模組已安裝)。
或者,您可以手動安裝 Microsoft.Windows.CppWinRT NuGet 套件,以轉換現有的專案。 安裝 (或更新為) 最新版本的 VSIX 延伸模組之後,請在 Visual Studio 中開啟現有的專案,按兩下 [專案>管理 NuGet 套件...>流覽],在搜尋方塊中輸入或貼上 Microsoft.Windows.CppWinRT,選取搜尋結果中的專案,然後按兩下 [安裝] 以安裝該專案的套件。 新增套件之後,您將取得專案的C++/WinRT MSBuild 支援,包括叫用 cppwinrt.exe
工具。
這很重要
如果您有專案是使用早於 1.0.190128.4 的 VSIX 延伸模組版本建立的(或升級後使用的),請參閱 舊版的 VSIX 延伸模組。 該區段包含項目組態的重要資訊,您必須知道才能升級這些專案,才能使用最新版本的 VSIX 擴充功能。
- 由於 C++/WinRT 使用來自 C++17 標準的功能,NuGet 套件會在 Visual Studio 中設定專案屬性 C/C++>Language>C++ Language Standard>ISO C++17 Standard (/std:c++17)。
- 它也會新增 /bigobj 編譯程序選項。
- 它會新增 /await 編譯程式選項,以啟用
co_await
。 - 它會指示 XAML 編譯程序發出 C++/WinRT codegen。
- 您可能也想要設定 一致性模式:是(/寬鬆-),這會進一步限制您的程式代碼符合標準。
- 另一個要注意的項目屬性是 C/C++>一般>將警告視為錯誤。 將此設定根據需要調整為 Yes(/WX) 或 No (/WX-)。 有時候,
cppwinrt.exe
工具所產生的來源檔案會產生警告,直到您將實作新增至它們為止。
在系統設定后,您將能夠在 Visual Studio 中建立和建置或開啟C++/WinRT 專案,並加以部署。
自 2.0 版起,Microsoft.Windows.CppWinRT NuGet 套件包含 cppwinrt.exe
工具。 您可以將 cppwinrt.exe
工具指向 Windows 執行時間元數據 (.winmd
) 檔案,以產生頭檔型標準C++連結庫,專案 元數據中所述的 API,以便從 C++/WinRT 程式代碼取用。 Windows 執行階段元資料(.winmd
)檔案提供描述 Windows 執行階段 API 表面的正式方法。 藉由指向元數據 cppwinrt.exe
,您可以產生連結庫,以便與第二方或第三方 Windows 運行時間元件中實作的任何運行時間類別搭配使用,或在您自己的應用程式中實作。 如需詳細資訊,請參閱 使用 C++/WinRT取用 API。
使用 C++/WinRT,您也可以使用標準C++來實作自己的運行時間類別,而不需使用 COM 樣式的程序設計。 針對執行階段類別,您只需在 IDL 檔案中描述您的類型,midl.exe
和 cppwinrt.exe
會為您產生成為樣板的實作原始碼檔案。 或者,您也可以從 C++/WinRT 基類衍生來實作介面。 如需詳細資訊,請參閱使用 C++/WinRT撰寫 API
如需 cppwinrt.exe
工具的自訂選項清單,請透過專案屬性設定,請參閱 Microsoft.Windows.CppWinRT NuGet 套件 自述檔。
您可以藉由在專案內安裝 Microsoft.Windows.CppWinRT NuGet 套件,來識別使用 C++/WinRT MSBuild 支援的專案。
以下是 VSIX 延伸模組所提供的 Visual Studio 專案範本。
空白應用程式 (C++/WinRT)
具有 XAML 使用者介面之通用 Windows 平臺 (UWP) app 的專案範本。
Visual Studio 提供 XAML 編譯程式支援,從位於每個 XAML 標記檔案後面的介面定義語言 (IDL) (.idl
) 檔案產生實作和標頭存根。 在 IDL 檔案中,定義您想要在應用程式 XAML 頁面中參考的任何本機運行時間類別,然後建置專案一次,以在 Generated Files
中產生實作範本,並在 Generated Files\sources
中產生存根類型定義。 然後使用這些存根類型定義作為參考來實作您的本地執行階段類別。 請參閱 將執行時間類別分解成 Midl 檔案 (.idl)。
Visual Studio for C++/WinRT 中的 XAML 設計介面支援與 C# 接近同位。 在 Visual Studio 中,您可以使用 [屬性] 視窗的 [事件] 索引卷標,在 C++/WinRT 專案中新增事件處理程式。 您也可以手動將事件處理程式新增至程序代碼,如需詳細資訊,請參閱 使用 C++/WinRT 中的委派來處理事件。
核心應用程式 (C++/WinRT)
通用 Windows 平臺 (UWP) 應用程式的專案範本,不會使用 XAML。
相反地,它使用 C++/WinRT 的 Windows 命名空間標頭來處理 Windows.ApplicationModel.Core 命名空間。 建置並執行之後,按兩下空白空間以新增彩色正方形;然後按兩下彩色方塊以拖曳它。
Windows 控制台應用程式 (C++/WinRT)
Windows Desktop C++/WinRT 用戶端應用程式的專案範本,具有主控台使用者介面。
Windows 桌面應用程式 (C++/WinRT)
Windows 桌面 C++/WinRT 用戶端應用程式的專案範本,會在 Win32 MessageBox中顯示 Windows 執行階段 Windows.Foundation.Uri。
Windows 執行階段元件 (C++/WinRT)
元件的專案範本;通常用於從通用 Windows 平臺 (UWP) 取用。
此範本示範 midl.exe
>cppwinrt.exe
工具鏈,其中 Windows 執行時間元數據 (.winmd
) 是從 IDL 產生,然後實作和標頭存根是從 Windows 執行時間元數據產生。
在IDL檔案中,定義元件中的運行時間類別、其預設介面,以及它們實作的任何其他介面。 一次建置專案,以產生 module.g.cpp
、module.h.cpp
、Generated Files
中的實作範本,以及 Generated Files\sources
中的存根類型定義。 然後使用這些存根類型定義作為參考,以便在您的元件中實現運行時類別。 請參閱 將執行時間類別分解成 Midl 檔案 (.idl)。
將建置的 Windows 執行階段元件二進位檔案及其 .winmd
與使用該元件的 UWP 應用程式捆綁在一起。
較早版本的 VSIX 擴充功能
我們建議您安裝 (或更新至) 最新版本的 VSIX 擴充功能,。 它預設會設定為自行更新。 如果您這樣做,而且您有使用 1.0.190128.4 之前的 VSIX 延伸模組版本所建立的專案,則本節包含升級這些專案以使用新版本的重要資訊。 如果您未更新,您仍然會在本節中找到有用的資訊。
就支援的 Windows SDK 和 Visual Studio 版本,以及 Visual Studio 組態而言,上述 Visual Studio 對 C++/WinRT、XAML、VSIX 擴充功能和 NuGet 套件 一節中的資訊適用於早期版本的 VSIX 擴充功能。 下列資訊說明與使用(或升級以使用)舊版所建立項目的行為和組態相關的重要差異。
建立早於 1.0.181002.2
如果您的專案是以 1.0.181002.2 之前的 VSIX 延伸模組版本建立,則C++/WinRT 組建支援內建於該版本的 VSIX 擴充功能中。 您的專案已在 <CppWinRTEnabled>true</CppWinRTEnabled>
檔案中設定 .vcxproj
屬性。
<Project ...>
<PropertyGroup Label="Globals">
<CppWinRTEnabled>true</CppWinRTEnabled>
...
您可以手動安裝 Microsoft.Windows.CppWinRT NuGet 套件來升級專案。 在安裝 (或升級至) 最新版本的 VSIX 延伸模組之後,在 Visual Studio 中開啟您的專案,單擊 [專案>管理 NuGet 套件...>流覽],在搜尋方塊中輸入或貼上 Microsoft.Windows.CppWinRT,選取搜尋結果中的專案,然後單擊 [安裝],以安裝專案的套件。
創建或升級至 1.0.181002.2 和 1.0.190128.3 之間
如果您的專案是以 1.0.181002.2 和 1.0.190128.3 之間的 VSIX 延伸模組版本建立,則專案範本會自動在專案中安裝 Microsoft.Windows.CppWinRT NuGet 套件。 您可能也已升級較舊的專案,以在此範圍內使用 VSIX 延伸模組的版本。 如果您這麼做,則因為此範圍中的 VSIX 延伸模組版本仍然存在組建支援,因此升級的專案可能或可能不會安裝Microsoft.Windows.CppWinRT NuGet 套件
若要升級您的專案,請遵循上一節中的指示,並確定您的專案已安裝 Microsoft.Windows.CppWinRT NuGet 套件。
無效的升級組態
使用最新版的 VSIX 擴充功能時,如果專案 <CppWinRTEnabled>true</CppWinRTEnabled>
NuGet 套件,則具有 屬性無效。 具有此組態的專案會產生建置錯誤訊息:「C++/WinRT VSIX 不再提供專案建置支援。 請將項目參考新增至 Microsoft.Windows.CppWinRT NuGet 套件。
如上所述,C++/WinRT 專案現在必須安裝 NuGet 套件。
由於 <CppWinRTEnabled>
元素現在已過時,因此您可以選擇性地編輯 .vcxproj
,並刪除元素。 這不是絕對必要的,但它是一個選項。
此外,如果您的 .vcxproj
包含 <RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>
,則可以將其移除,讓您可以建置,而不需要安裝 C++/WinRT VSIX 擴充功能。
C++/WinRT 的 SDK 支援
雖然它現在僅為了相容性理由,但從 10.0.17134.0 版起(Windows 10 版本 1803),Windows SDK 包含頭檔案為基礎的標準 C++ 程式庫,以使用第一方 Windows API(Windows 命名空間中的 Windows 運行時間 API)。 這些標頭位於資料夾%WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt
內。 從 Windows SDK 版本 10.0.17763.0(Windows 10 版本 1809)起,這些 header 檔(標頭)會在您的專案的 $(GeneratedFilesDir) 資料夾中自動生成。
同樣地,為了相容,Windows SDK 也隨附 cppwinrt.exe
工具。 不過,我們建議您改為安裝並使用最新版的 cppwinrt.exe
,其隨附於 Microsoft.Windows.CppWinRT NuGet 套件中。 在上面的各節中描述了該套件和 cppwinrt.exe
。
C++/WinRT 投影中的自定義類型
在 C++/WinRT 程式設計中,您可以使用標準 C++ 語言功能和 C++ 標準數據類型 ,以及 C++/WinRT,其中包括一些 C++ 標準函式庫數據類型。 而且,您也會注意到投影中的一些自訂資料型別,並可以選擇使用它們。 例如,我們在快速入門程式代碼範例中使用 winrt::hstring,開始使用 C++/WinRT。
winrt::com_array 是您可能在某個時候會使用的另一種型別。 但是,您不太可能直接使用類型,例如 winrt::array_view。 或者,您可以選擇不使用它,這樣當C++標準庫出現對應類型時,您就不需要更改任何程式代碼。
警告
具有一些類型,您可能會在仔細研究 C++/WinRT 的 Windows 命名空間標頭檔時看到。 例如 winrt::param::hstring,但也有集合的例子。 這些只是為了優化輸入參數的系結,而且它們會產生很大的效能改善,並讓大部分呼叫模式「僅能運作」,以用於相關的標準C++類型和容器。 只有在投影新增大部分值時,才會使用這些類型。 它們已高度優化,不適用於一般用途。不要輕易嘗試自行使用它們。 您也不應該使用來自 winrt::impl
命名空間的任何專案,因為這些是實作類型,因此可能會變更。 您應該繼續使用標準類型,或來自 winrt 命名空間的類型。
請參閱 將參數傳遞到 ABI 邊界。