類型系統概觀 (C++/CX)

藉由使用Windows 執行階段架構,您可以使用 C++/WinRT、C++/CX、Visual Basic、Visual C# 和 JavaScript 來撰寫應用程式和元件。 他們可以直接存取 Windows API,並與其他Windows 執行階段應用程式和元件交互操作。 以 C++ 撰寫的 通用 Windows 平臺 (UWP) 應用程式會編譯成直接在 CPU 中執行的機器碼。 以 C# 或 Visual Basic 撰寫的 UWP 應用程式會編譯為 Microsoft 中繼語言 (MSIL),並在 Common Language Runtime (CLR) 中執行。 以 JavaScript 撰寫的 UWP 應用程式會在 JavaScript 執行時間環境中執行。 Windows 執行階段作業系統元件本身是以 C++ 撰寫,並以機器碼的形式執行。 所有這些元件和 UWP 應用程式都會透過Windows 執行階段應用程式二進位介面 (ABI) 直接通訊。

為了啟用新式 C++ 語式中Windows 執行階段的支援,Microsoft 建立了 C++/CX 語言延伸模組。 C++/CX 提供基本Windows 執行階段型別的內建基底類型和實作。 這些類型可讓 C++ 應用程式和元件與以其他語言撰寫的應用程式在 ABI 之間通訊。 C++/CX 應用程式可以使用任何Windows 執行階段類型。 它們也可以建立類別、結構、介面和其他使用者定義類型,而其他 UWP 應用程式和元件可以取用。 以 C++/CX 撰寫的 UWP 應用程式也可以使用一般 C++ 類別和結構,只要它們沒有公用協助工具即可。

如需 C++/CX 語言投影和其運作方式的深入討論,請參閱部落格文章:

注意

雖然仍支援 C++/CX,但建議您改為針對新的Windows 執行階段應用程式和元件使用 C++/WinRT 。 其設計目的是要為您提供新式 Windows API 的第一級存取權。 儘管名稱是 C++/WinRT,但只使用標準 C++17 且沒有延伸模組。 它會使用僅限標頭的程式庫來實作Windows 執行階段 API 的 C++ 語言投影。 從 1803 版(10.0.17134.0)開始,Windows SDK 中提供 C++/WinRT。

Windows 中繼資料 (.winmd) 檔案

當您編譯以 C++ 撰寫的 UWP 應用程式時,編譯器會在機器碼中產生可執行檔,並產生個別的 Windows 中繼資料 ( .winmd ) 檔案,其中包含公用Windows 執行階段類型的描述,其中包括類別、結構、列舉、介面、參數化介面和委派。 中繼資料的格式類似 .NET Framework 組件中使用的格式。 在 C++ 元件中 .winmd ,檔案只包含中繼資料;可執行檔程式碼位於個別的檔案中。 Windows 隨附的Windows 執行階段元件會使用此相片順序。 .winmd檔案名必須符合或必須是原始程式碼中根命名空間的前置詞。 (針對 .NET Framework 語言,檔案 .winmd 同時包含程式碼和中繼資料,就像 .NET Framework 元件一樣。

檔案中的 .winmd 中繼資料代表您程式碼的已發佈介面。 無論撰寫其他應用程式的語言為何,其他 UWP app 都可以看到已發佈的類型。 中繼資料或已發佈的程式碼只能包含Windows 執行階段類型系統指定的類型。 您無法發佈 C++特定的語言建構,例如一般類別、陣列、範本或 C++ 標準程式庫 (STL) 容器。 JavaScript 或 C# 用戶端應用程式不知道如何使用它們。

類型或方法是否出現在中繼資料中,取決於套用哪些存取範圍修飾詞。 若要可見,型別必須在命名空間中宣告,而且必須宣告為 public 。 不允許 publicref class 在程式碼中做為內部協助程式類型;它只會在中繼資料中看不到。 即使在 中 public ref class ,並非所有成員都一定可見。 下表列出 中 C++ 存取規範 public ref class 與Windows 執行階段中繼資料可見度之間的關聯性:

在中繼資料中發行 未在中繼資料中發行
public private
protected internal
public protected private protected

您可以使用 物件瀏覽器 來檢視檔案的內容 .winmd 。 Windows 執行階段 Windows 隨附的元件位於 檔案中 Windows.winmd 。 檔案 default.winmd 包含 C++/CX 中使用的基本類型,並 platform.winmd 包含命名空間中的 Platform 類型。 根據預設,這三 .winmd 個檔案會包含在 UWP app 的每個 C++ 專案中。

提示

命名空間 中的 Platform::Collections 類型不會出現在檔案中 .winmd ,因為它們不是公用的。 它們是 中 Windows::Foundation::Collections 定義之介面的私人 C++特定實作。 以 JavaScript 或 C# 撰寫的Windows 執行階段應用程式並不知道類別 是什麼 Platform::Collections::Vector ,但它可以使用 Windows::Foundation::Collections::IVector 。 型 Platform::Collections 別定義于 中 collection.h

C++/CX 中的Windows 執行階段類型系統

下列各節說明Windows 執行階段類型系統的主要功能,以及 C++/CX 支援它們的方式。

命名空間

所有Windows 執行階段類型都必須在命名空間內宣告;Windows API 本身是由命名空間組織。 檔案 .winmd 的名稱必須與根命名空間具有相同的名稱。 例如,只有在名為 、 A.B.winmdA.B.C.winmd 的中繼資料檔案中定義名為 A.B.C.MyClass 的類別時,才能具現化名為 A.winmd 的類別。 不需要 DLL 的名稱,才能符合 .winmd 檔案名。

Windows API 本身已改造成一套以命名空間組織的構造良好類別庫。 所有Windows 執行階段元件都會在命名空間中 Windows.* 宣告。

如需詳細資訊,請參閱 命名空間和類型可見度

基本類型

Windows 執行階段定義下列基本類型: UInt8 、、 Int32UInt32UInt64SingleInt64Int16UInt16DoubleChar16Boolean 和 。 String C++/CX 在其預設命名空間中支援基本數數值型別,例如 uint16 、、 uint64int32int64uint32int16 、、、 float32float64 和 。 char16 BooleanString 也會在 命名空間中 Platform 定義。

C++/CX 也會定義 uint8 與 相等 unsigned char 的 ,這在Windows 執行階段中不受支援,而且無法在公用 API 中使用。

基本類型可藉由將它包裝在介面中 Platform::IBox 來設為可為 Null。 如需詳細資訊,請參閱 實值類別與結構中定義的介面的私用 C++ 專屬實作。

如需基本型別的詳細資訊,請參閱 基本類型

字串

Windows 執行階段字串是 16 位 UNICODE 字元的不可變序列。 Windows 執行階段字串投影為 Platform::String^ 。 這個類別提供建構、操作及與 wchar_t之間轉換字串的方法。

如需詳細資訊,請參閱 字串中定義的介面的私用 C++ 專屬實作。

陣列

Windows 執行階段支援任何類型的一維陣列。 不支援陣列的陣列。 在 C++/CX 中,Windows 執行階段陣列投影為 Platform::Array 類別

如需詳細資訊,請參閱 ArrayWriteOnlyArray

ref classref struct 類型

Windows 執行階段類別會投影在 C++/CX 中做為 ref classref struct 型別,因為它是以傳址方式複製。 和 ref struct 物件的記憶體管理 ref class 會透過參考計數以透明方式處理。 當物件的最後一個參考超出範圍時,就會終結物件。 ref classref struct 類型可以:

  • 包含成員建構函式、方法、屬性和事件。 這些成員可以具有 publicprivateprotectedinternal 協助工具。

  • 可以包含私人巢狀 enumstructclass 定義。

  • 可以直接繼承自一個基底類別,也可以實作任意數目的介面。 所有 ref class 物件都會隱含轉換成 Platform::Object 類別 ,而且可以覆寫其虛擬方法, Object::ToString 例如 。

ref class具有公用建構函式的 ,必須宣告為 sealed ,以避免進一步衍生。

如需詳細資訊,請參閱 Ref 類別與結構

value classvalue struct 類型

value classvalue struct 表示基本資料結構,而且只包含欄位 value class ,可能是類型、 value struct 型別或型別 Platform::String^value structvalue class 物件會依值複製。

value struct可以藉由將它包裝在介面中 IBox ,將它設為可為 Null。

如需詳細資訊,請參閱 實值類別與結構中定義的介面的私用 C++ 專屬實作。

部分類別

部分類別功能可讓您在多個檔案中定義一個類別。 它可讓 XAML 編輯器之類的程式碼產生工具修改一個檔案,而不需要觸及您編輯的另一個檔案。

如需詳細資訊,請參閱 部分類別

屬性

屬性是任何Windows 執行階段類型的公用資料成員。 它會使用 property 關鍵字來宣告和定義。 屬性會實作為 get/set 方法組。 用戶端程式碼將屬性視為公用欄位來存取。 不需要任何自訂 getset 程式碼的屬性稱為 簡單屬性 ,而且可以宣告而不明確 getset 方法。

如需詳細資訊,請參閱 屬性中定義的介面的私用 C++ 專屬實作。

C++/CX 中的Windows 執行階段集合

Windows 執行階段會定義一組集合類型的介面,每個語言都會以自己的方式實作。 C++/CX 提供類別 Platform::Collections::Map 類別 和其他相關具體集合類型的實 Platform::Collections::Vector 作,這些類型與其 C++ 標準程式庫對應專案相容。

如需詳細資訊,請參閱 集合

範本 ref class 類型

privateinternal 存取 ref class 類型可以範本化和特製化。

如需詳細資訊,請參閱 樣板 ref 類別中定義的介面的私用 C++ 專屬實作。

介面

Windows 執行階段介面會定義一組公用屬性、方法和事件, ref class 如果 或 ref struct 型別繼承自 介面,則必須實作該公用屬性、方法和事件。

如需詳細資訊,請參閱介面

列舉

enum classWindows 執行階段中的類型類似于 C++ 中的範圍 enum 。 基礎類型為 int32 ,除非套用 [Flags] 屬性,否則基礎類型為 uint32

如需詳細資訊,請參閱 列舉中定義的介面的私用 C++ 專屬實作。

委派

Windows 執行階段中的委派類似于 std::function C++ 中的 物件。 這是一種特殊 ref class 類型,可用來叫用具有相容簽章的用戶端提供函式。 委派最常用於Windows 執行階段做為事件種類。

如需詳細資訊,請參閱 委派中定義的介面的私用 C++ 專屬實作。

例外狀況

在 C++/CX 中,您可以攔截自訂例外狀況類型、 std::exception 類型和 Platform::Exception 類型。

如需詳細資訊,請參閱 例外狀況中定義的介面的私用 C++ 專屬實作。

事件

事件是 或 ref struct 中的 ref class 公用成員,其類型為委派類型。 事件只能由主控類別叫用,也就是引發。 不過,用戶端程式代碼可以提供自己的事件處理常式函式,當擁有類別引發事件時,就會叫用此函式。

如需詳細資訊,請參閱事件

轉型

C++/CX 支援標準 C++ 轉換運算子 static_castdynamic_castreinterpret_cast ,以及 safe_cast C++/CX 特有的運算子。

如需詳細資訊,請參閱 轉型中定義的介面的私用 C++ 專屬實作。

Box 處理

Boxed 變數是包裝在參考型別中的實值型別。 在需要參考語意的情況下,請使用 Boxed 變數。

如需詳細資訊,請參閱 Boxing中定義的介面的私用 C++ 專屬實作。

屬性

屬性是中繼資料值,可以套用至任何Windows 執行階段類型或類型成員。 您可以在執行時間檢查屬性。 Windows 執行階段會定義命名空間中的 Windows::Foundation::Metadata 一組通用屬性。 此版本中Windows 執行階段不支援公用介面上的使用者定義屬性。

API 取代

您可以使用Windows 執行階段系統類型所使用的相同屬性,將公用 API 標示為已被取代。

如需詳細資訊,請參閱 淘汰類型和成員

另請參閱

C++/CX 語言參考