知識マップ: DLL・COMインターフェースの後方互換性 ── どの変更が呼び出し側を壊すのかの判断表
記事「DLL・COMインターフェースの後方互換性 ── どの変更が呼び出し側を壊すのかの判断表」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、DLL・COM・.NETという3つの技術それぞれで、どの変更が呼び出し側を壊すのかを機械的に判定する方法を整理する。ネイティブDLLはエクスポートテーブルと呼び出し規約というABIの契約で決まり、cbSize慣習で構造体を拡張可能にできる。COMインターフェースはvtableというバイナリレイアウトゆえに公開後は不変とされ、変更は新しいIIDを持つ新インターフェースとして追加してQueryInterfaceで判別させる。事前バインディングのVB6/VBAクライアントは特にレイアウト変更で壊れやすい。.NETにはMicrosoft自身が使う互換性変更ルールがあり、バイナリ・ソース・動作互換の3層で変更を分類し、semverや強い名前のAssemblyVersion管理と組み合わせて運用する。
flowchart LR
accTitle: DLL・COMインターフェースの後方互換性の知識マップ
accDescr: ネイティブDLLのABI・エクスポート序数・cbSize慣習、COMインターフェースのvtable・IID・QueryInterfaceによる公開後不変の原則とVB6事前バインディングとの関係、そして.NETの互換性変更ルールがバイナリ・ソース・動作互換の3層およびAssemblyVersion・semverとどうつながるかを示す図
dll["DLL(ダイナミックリンクライブラリ)"]
com_interface["COMインターフェース"]
dotnet_compatibility_change_rules[".NETの互換性変更ルール"]
abi["ABI(Application Binary Interface)"]
calling_convention["呼び出し規約(calling convention)"]
export_ordinal["エクスポート序数(ordinal)"]
cbsize_convention["cbSize慣習"]
binary_compatibility["バイナリ互換"]
com["COM(コンポーネントオブジェクトモデル)"]
vtable["vtable(仮想関数テーブル)"]
iid["IID(インターフェース識別子)"]
queryinterface["QueryInterface"]
progid["ProgID(Programmatic Identifier)"]
clsid["CLSID(Class ID)"]
vb6["Visual Basic 6.0(VB6)"]
vb6_early_binding["VB6/VBAの事前バインディング"]
type_library["型ライブラリ(TLB)"]
dotnet[".NET(Core以降)"]
source_compatibility["ソース互換"]
behavioral_compatibility["動作互換"]
default_interface_member["既定インターフェースメンバ(DIM)"]
dotnet_framework[".NET Framework"]
strong_name["強い名前(strong name)"]
assembly_version["AssemblyVersion"]
binding_redirect["バインディングリダイレクト"]
semver["セマンティックバージョニング(semver)"]
package_validation_apicompat["Package Validation / ApiCompat"]
dll -->|"利用する"| abi
abi -->|"利用する"| calling_convention
dll -->|"利用する"| export_ordinal
dll -.->|"利用する"| cbsize_convention
dll -.->|"前提とする"| binary_compatibility
com -->|"利用する"| com_interface
com_interface -->|"利用する"| vtable
com_interface -->|"前提とする"| iid
com_interface -->|"前提とする"| queryinterface
com_interface -->|"前提とする"| binary_compatibility
progid -->|"利用する"| clsid
clsid -.->|"前提とする"| com_interface
vb6 -.->|"利用する"| vb6_early_binding
vb6_early_binding -->|"前提とする"| vtable
vb6_early_binding -->|"前提とする"| type_library
com_interface -.->|"両立しない"| vb6_early_binding
dotnet -->|"利用する"| dotnet_compatibility_change_rules
dotnet_compatibility_change_rules -->|"利用する"| binary_compatibility
dotnet_compatibility_change_rules -->|"利用する"| source_compatibility
dotnet_compatibility_change_rules -->|"利用する"| behavioral_compatibility
dotnet_compatibility_change_rules -.->|"利用する"| default_interface_member
default_interface_member -->|"両立しない"| dotnet_framework
dotnet -.->|"利用する"| strong_name
strong_name -->|"利用する"| assembly_version
assembly_version -.->|"前提とする"| binding_redirect
semver -.->|"前提とする"| dotnet_compatibility_change_rules
dotnet_compatibility_change_rules -->|"で確認できる"| package_validation_apicompat
概念間の関係(全27件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- DLL(ダイナミックリンクライブラリ)はABI(Application Binary Interface)を利用します。
- ABI(Application Binary Interface)は呼び出し規約(calling convention)を利用します。
- DLL(ダイナミックリンクライブラリ)はエクスポート序数(ordinal)を利用します。
- DLL(ダイナミックリンクライブラリ)はcbSize慣習を利用します。
- DLL(ダイナミックリンクライブラリ)はバイナリ互換を前提とします。
- COM(コンポーネントオブジェクトモデル)はCOMインターフェースを利用します。
- COMインターフェースはvtable(仮想関数テーブル)を利用します。
- COMインターフェースはIID(インターフェース識別子)を前提とします。
- COMインターフェースはQueryInterfaceを前提とします。
- COMインターフェースはバイナリ互換を前提とします。
- ProgID(Programmatic Identifier)はCLSID(Class ID)を利用します。
- CLSID(Class ID)はCOMインターフェースを前提とします。
- Visual Basic 6.0(VB6)はVB6/VBAの事前バインディングを利用します。
- VB6/VBAの事前バインディングはvtable(仮想関数テーブル)を前提とします。
- VB6/VBAの事前バインディングは型ライブラリ(TLB)を前提とします。
- COMインターフェースはVB6/VBAの事前バインディングと両立しません。
- .NET(Core以降)は.NETの互換性変更ルールを利用します。
- .NETの互換性変更ルールはバイナリ互換を利用します。
- .NETの互換性変更ルールはソース互換を利用します。
- .NETの互換性変更ルールは動作互換を利用します。
- .NETの互換性変更ルールは既定インターフェースメンバ(DIM)を利用します。
- 既定インターフェースメンバ(DIM)は.NET Frameworkと両立しません。
- .NET(Core以降)は強い名前(strong name)を利用します。
- 強い名前(strong name)はAssemblyVersionを利用します。
- AssemblyVersionはバインディングリダイレクトを前提とします。
- セマンティックバージョニング(semver)は.NETの互換性変更ルールを前提とします。
- .NETの互換性変更ルールはPackage Validation / ApiCompatで確認できます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。