知識マップ: WinRTはCOMである ── IInspectable・.winmd・言語プロジェクション、そしてWinUIが今もバイナリ契約の上に乗っている理由
記事「WinRTはCOMである ── IInspectable・.winmd・言語プロジェクション、そしてWinUIが今もバイナリ契約の上に乗っている理由」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
WinRT(Windows Runtime)はマネージドランタイムではなく、COMを土台にしたABIにメタデータ(.winmd)と言語プロジェクションを足したものです。すべてのWinRTインターフェースはIInspectableを要求し、IInspectableはIUnknownを要求します。QueryInterface・AddRef・Releaseは今もすべての呼び出しの土台であり、IInspectableが追加するのはGetIids・GetRuntimeClassName・GetTrustLevelの3メソッドだけです。GetRuntimeClassNameが返す型名をメタデータで解決できることが言語プロジェクションを可能にしています。.winmdはECMA-335(CLRアセンブリと同じ)の物理形式を借りた機械可読メタデータで、システム提供のものは実行コードを含みません。C++/WinRTとC#/WinRT(CsWinRT)はこのメタデータから各言語の慣用に沿ったAPIを生成する投影であり、.NET 5で組み込みWinRTサポートが削除されて以降、C#の投影は独立したツールチェーンになりました。WinRT APIの大半はWPF・WinForms・Win32のデスクトップアプリから呼べますが、ピッカーなどCoreWindow依存のUI系クラスは表示前にIInitializeWithWindow(共有UIのDataTransferManagerは専用のIDataTransferManagerInterop)でオーナーウィンドウのHWNDを渡す必要があり、通知履歴などpackage identity必須のAPIはMSIXまたは外部の場所を指すパッケージによるパッケージ化を要求し、スレッドは事前のWinRT用初期化が必要です(ネイティブコードではRoInitializeやwinrt::init_apartmentでSTA/MTAの並行性モデルを指定し、C#のWPF/WinFormsアプリでは通常ランタイム側が処理します)。WinUIはWindows App SDKの一部として提供されるWinRT ABIの上のUIフレームワークで、既存WPF/WinForms画面へのWinUIコントロールの段階混在(XAML Islands)は世代ごとに対応と制約が異なります。
flowchart LR
accTitle: WinRTとCOMの知識マップ
accDescr: WinRTがCOMを前提としIInspectableと.winmdを利用する構造、すべてのWinRTインターフェースが要求するIInspectableがIUnknownを前提とすること、.winmdがECMA-335形式を利用し言語プロジェクションがそれを読むこと、C++/WinRTとC#/WinRTが言語プロジェクションの実装を担い、C#/WinRTが.NET組み込みWinRTサポートの後継であること、WinUIがWindows App SDKとWinRTを前提とすること、CoreWindow依存のWinRT UIがデスクトップアプリではIInitializeWithWindowなどUI固有のinteropによるHWNDの受け渡しを前提とすること、package identity必須のWinRT APIがpackage identityを前提とし、それがMSIXまたは外部の場所を指すパッケージで構成できること、RoInitializeがSTA/MTAというCOMのアパートメントモデルを利用すること、既存WPF/WinFormsへのWinUI段階移行が制約付きのXAML Islandsを利用することを示す図
winrt["WinRT(Windows Runtime)"]
com["COM(コンポーネントオブジェクトモデル)"]
iinspectable["IInspectable"]
iunknown["IUnknown"]
winmd["Windows Metadata(.winmd)"]
ecma_335["ECMA-335"]
language_projection["言語プロジェクション"]
cpp_winrt["C++/WinRT"]
cs_winrt["C#/WinRT(CsWinRT)"]
dotnet_builtin_winrt_support[".NET組み込みWinRTサポート"]
winui["WinUI(Windows App SDK)"]
windows_app_sdk["Windows App SDK"]
core_window_dependent_ui["CoreWindow依存のWinRT UI"]
initialize_with_window["IInitializeWithWindow"]
hwnd["HWND(ウィンドウハンドル)"]
data_transfer_manager_interop["IDataTransferManagerInterop"]
package_identity_required_winrt_api["package identity必須のWinRT API"]
package_identity["package identity"]
msix_packaging["MSIXパッケージング(packaged)"]
sparse_package["外部の場所を指すpackaged(sparse package)"]
ro_initialize["RoInitialize"]
com_apartment_model["COMアパートメントモデル(STA/MTA)"]
gradual_winui_migration["既存WPF/WinFormsへのWinUI段階移行"]
xaml_islands["XAML Islands"]
winrt -->|"前提とする"| com
winrt -->|"前提とする"| iinspectable
iinspectable -->|"前提とする"| iunknown
winrt -->|"利用する"| winmd
winmd -->|"利用する"| ecma_335
language_projection -->|"利用する"| winmd
cpp_winrt -->|"実装を担う"| language_projection
cs_winrt -->|"実装を担う"| language_projection
cs_winrt -->|"の後継"| dotnet_builtin_winrt_support
winui -->|"前提とする"| windows_app_sdk
winui -->|"前提とする"| winrt
core_window_dependent_ui -.->|"前提とする"| initialize_with_window
initialize_with_window -->|"利用する"| hwnd
core_window_dependent_ui -.->|"前提とする"| data_transfer_manager_interop
data_transfer_manager_interop -->|"利用する"| hwnd
package_identity_required_winrt_api -->|"前提とする"| package_identity
package_identity -->|"で構成できる"| msix_packaging
package_identity -->|"で構成できる"| sparse_package
ro_initialize -->|"利用する"| com_apartment_model
gradual_winui_migration -.->|"利用する"| xaml_islands
概念間の関係(全20件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- WinRT(Windows Runtime)はCOM(コンポーネントオブジェクトモデル)を前提とします。
- WinRT(Windows Runtime)はIInspectableを前提とします。
- IInspectableはIUnknownを前提とします。
- WinRT(Windows Runtime)はWindows Metadata(.winmd)を利用します。
- Windows Metadata(.winmd)はECMA-335を利用します。
- 言語プロジェクションはWindows Metadata(.winmd)を利用します。
- C++/WinRTは言語プロジェクションの実装を担います。
- C#/WinRT(CsWinRT)は言語プロジェクションの実装を担います。
- C#/WinRT(CsWinRT)は.NET組み込みWinRTサポートの後継に当たります。
- WinUI(Windows App SDK)はWindows App SDKを前提とします。
- WinUI(Windows App SDK)はWinRT(Windows Runtime)を前提とします。
- CoreWindow依存のWinRT UIはIInitializeWithWindowを前提とします。
- IInitializeWithWindowはHWND(ウィンドウハンドル)を利用します。
- CoreWindow依存のWinRT UIはIDataTransferManagerInteropを前提とします。
- IDataTransferManagerInteropはHWND(ウィンドウハンドル)を利用します。
- package identity必須のWinRT APIはpackage identityを前提とします。
- package identityはMSIXパッケージング(packaged)で構成できます。
- package identityは外部の場所を指すpackaged(sparse package)で構成できます。
- RoInitializeはCOMアパートメントモデル(STA/MTA)を利用します。
- 既存WPF/WinFormsへのWinUI段階移行はXAML Islandsを利用します。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。