分享方式:


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

藉由使用 Windows 執行階段架構,您可以使用 C++/WinRT、C++/CX、Visual Basic、Visual C# 和 JavaScript 來撰寫應用程式和元件。 這些可以直接存取 Windows API,並與其他 Windows 執行階段應用程式和元件相互操作。 以 C++ 撰寫的通用 Windows 平台 (UWP) 應用程式會編譯為直接在 CPU 中執行的原生程式碼。 以 C# 或 Visual Basic 撰寫的 UWP 應用程式會編譯成 Microsoft Intermediate Language (MSIL),並在通用語言執行平台 (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,但建議您改用 C++/WinRT,以用於新的 Windows 執行階段應用程式和元件。 其設計成將現代 Windows API 的第一級存取提供給您。 儘管名稱如此,C++/WinRT 只會使用標準 C++17,沒有延伸模組。 它會使用僅限標頭的程式庫來實作適用於 Windows 執行階段 API 的 C++語言投影。 從 1803 版 (10.0.17134.0) 開始,Windows SDK 中會提供 C++/WinRT。

Windows 中繼資料 (.winmd) 檔案

在編譯以 C++撰寫的 UWP 應用程式時,編譯器會以原生電腦程式碼產生可執行檔,也會產生包含公用 Windows 執行階段型別描述的個別 Windows 中繼資料 (.winmd) 檔案,這些型別包括類別、結構、列舉,介面、參數化介面及委派。 中繼資料的格式類似 .NET Framework 組件中使用的格式。 在 C++ 元件中,.winmd 檔案只包含中繼資料,可執行程式碼位於另一個檔案中。 Windows 隨附的 Windows 執行階段元件會使用此排列方式。 .winmd 檔案名稱必須符合原始程式碼中的根命名空間或為根命名空間的首碼。 (對於 .NET Framework 語言,.winmd 檔案包含程式碼和中繼資料,如同 .NET Framework 組件一樣)。

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

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

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

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

提示

因為 Platform::Collections命名空間 中的型別不是公用的,所以不會出現在 .winmd 檔案中。 這些型別是 Windows::Foundation::Collections中定義的介面的私用 C++ 專屬實作。 以 JavaScript 或 C# 撰寫的 Windows 執行階段應用程式無法辨識 Platform::Collections::Vector 類別,但可以使用 Windows::Foundation::Collections::IVectorPlatform::Collections 型別是在 collection.h 中定義。

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

下列章節描述 Windows 執行階段型別系統的主要功能,以及 C++/CX 中如何支援這些功能。

命名空間

所有 Windows 執行階段型別必須在命名空間內宣告,而 Windows API 本身以命名空間來組織。 .winmd 檔案必須具有根命名空間的相同名稱。 例如,名為 A.B.C.MyClass 的類別必須在名為 A.winmdA.B.winmdA.B.C.winmd 的中繼資料檔案中定義,才能執行個體化。 DLL 的名稱不需符合 .winmd 檔案名稱。

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

如需詳細資訊,請參閱命名空間和型別可視性

基本類型

Windows 執行階段會定義下列基本型別:UInt8Int16UInt16Int32UInt32Int64UInt64SingleDoubleChar16BooleanString。 C++/CX 支援預設命名空間中的基本數值型別:uint16uint32uint64int16int32int64float32float64char16BooleanString 也定義在 Platform 命名空間中。

C++/CX 也會定義 uint8,相當於 windows 執行階段不支援的 unsigned char,而且無法在公用 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 classref struct 物件的記憶體管理會透過參考計數以透明方式處理。 當物件的最後一個參考超出範圍時,就會終結物件。 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 程式碼的屬性稱為 trivial 屬性,可宣告為不具有明確的 getset 方法。

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

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

Windows 執行階段會定義集合型別的一組介面,由各種語言以自己的方式實作。 C++/CX 會在 Platform::Collections::Vector 類別Platform::Collections::Map 類別和其他相關的具體集合型別中提供實作,與其 C++ Standard Library 對應項目相容。

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

範本 ref class 型別

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

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

介面

Windows 執行階段介面會定義一組公用屬性、方法和事件,繼承自此介面的 ref classref struct 型別都必須實作。

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

列舉

Windows 執行階段中的 enum class 型別類似於 C++ 的範圍 enum。 基礎型別是 int32,但如果套用 [Flags] 屬性,則基礎型別是 uint32

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

委派

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

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

例外狀況

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

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

事件

事件是 ref classref struct 中具有委派型別的公用成員。 事件只能由主控類別叫用,也就是引發。 不過,用戶端程式碼可以提供自己的事件處理常式函式,在主控類別引發事件時叫用。

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

轉型

C++/CX 支援標準 C++ 投射運算子 static_castdynamic_castreinterpret_cast,以及 C++/CX 專屬的 safe_cast 運算子。

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

Box 處理

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

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

屬性

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

API 取代

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

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

另請參閱

C++/CX 語言參考