類型系統概觀 (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
。 不允許 public
ref 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.winmd
或 A.B.C.winmd
的中繼資料檔案中定義名為 A.B.C.MyClass
的類別時,才能具現化名為 A.winmd
的類別。 不需要 DLL 的名稱,才能符合 .winmd
檔案名。
Windows API 本身已改造成一套以命名空間組織的構造良好類別庫。 所有Windows 執行階段元件都會在命名空間中 Windows.*
宣告。
如需詳細資訊,請參閱 命名空間和類型可見度 。
基本類型
Windows 執行階段定義下列基本類型: UInt8
、、 Int32
UInt32
UInt64
Single
Int64
Int16
UInt16
Double
、 Char16
、 Boolean
和 。 String
C++/CX 在其預設命名空間中支援基本數數值型別,例如 uint16
、、 uint64
int32
int64
uint32
int16
、、、 float32
float64
和 。 char16
Boolean
和 String
也會在 命名空間中 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
類別 。
如需詳細資訊,請參閱 Array
和 WriteOnlyArray
。
ref class
和 ref struct
類型
Windows 執行階段類別會投影在 C++/CX 中做為 ref class
或 ref struct
型別,因為它是以傳址方式複製。 和 ref struct
物件的記憶體管理 ref class
會透過參考計數以透明方式處理。 當物件的最後一個參考超出範圍時,就會終結物件。 ref class
或 ref struct
類型可以:
包含成員建構函式、方法、屬性和事件。 這些成員可以具有
public
、private
、protected
或internal
協助工具。可以包含私人巢狀
enum
、struct
或class
定義。可以直接繼承自一個基底類別,也可以實作任意數目的介面。 所有
ref class
物件都會隱含轉換成Platform::Object
類別 ,而且可以覆寫其虛擬方法,Object::ToString
例如 。
ref class
具有公用建構函式的 ,必須宣告為 sealed
,以避免進一步衍生。
如需詳細資訊,請參閱 Ref 類別與結構
value class
和 value struct
類型
value class
或 value struct
表示基本資料結構,而且只包含欄位 value class
,可能是類型、 value struct
型別或型別 Platform::String^
。 value struct
和 value class
物件會依值複製。
value struct
可以藉由將它包裝在介面中 IBox
,將它設為可為 Null。
如需詳細資訊,請參閱 實值類別與結構中定義的介面的私用 C++ 專屬實作。
部分類別
部分類別功能可讓您在多個檔案中定義一個類別。 它可讓 XAML 編輯器之類的程式碼產生工具修改一個檔案,而不需要觸及您編輯的另一個檔案。
如需詳細資訊,請參閱 部分類別
屬性
屬性是任何Windows 執行階段類型的公用資料成員。 它會使用 property
關鍵字來宣告和定義。 屬性會實作為 get
/set
方法組。 用戶端程式碼將屬性視為公用欄位來存取。 不需要任何自訂 get
或 set
程式碼的屬性稱為 簡單屬性 ,而且可以宣告而不明確 get
或 set
方法。
如需詳細資訊,請參閱 屬性中定義的介面的私用 C++ 專屬實作。
C++/CX 中的Windows 執行階段集合
Windows 執行階段會定義一組集合類型的介面,每個語言都會以自己的方式實作。 C++/CX 提供類別 、 Platform::Collections::Map
類別 和其他相關具體集合類型的實 Platform::Collections::Vector
作,這些類型與其 C++ 標準程式庫對應專案相容。
如需詳細資訊,請參閱 集合 。
範本 ref class
類型
private
和 internal
存取 ref class
類型可以範本化和特製化。
如需詳細資訊,請參閱 樣板 ref 類別中定義的介面的私用 C++ 專屬實作。
介面
Windows 執行階段介面會定義一組公用屬性、方法和事件, ref class
如果 或 ref struct
型別繼承自 介面,則必須實作該公用屬性、方法和事件。
如需詳細資訊,請參閱介面。
列舉
enum class
Windows 執行階段中的類型類似于 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_cast
、 dynamic_cast
和 reinterpret_cast
,以及 safe_cast
C++/CX 特有的運算子。
如需詳細資訊,請參閱 轉型中定義的介面的私用 C++ 專屬實作。
Box 處理
Boxed 變數是包裝在參考型別中的實值型別。 在需要參考語意的情況下,請使用 Boxed 變數。
如需詳細資訊,請參閱 Boxing中定義的介面的私用 C++ 專屬實作。
屬性
屬性是中繼資料值,可以套用至任何Windows 執行階段類型或類型成員。 您可以在執行時間檢查屬性。 Windows 執行階段會定義命名空間中的 Windows::Foundation::Metadata
一組通用屬性。 此版本中Windows 執行階段不支援公用介面上的使用者定義屬性。
API 取代
您可以使用Windows 執行階段系統類型所使用的相同屬性,將公用 API 標示為已被取代。
如需詳細資訊,請參閱 淘汰類型和成員 。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應