知識マップ: DLL・COMインターフェースの後方互換性 ── どの変更が呼び出し側を壊すのかの判断表

記事「DLL・COMインターフェースの後方互換性 ── どの変更が呼び出し側を壊すのかの判断表」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、DLL・COM・.NETという3つの技術それぞれで、どの変更が呼び出し側を壊すのかを機械的に判定する方法を整理する。ネイティブDLLはエクスポートテーブルと呼び出し規約というABIの契約で決まり、cbSize慣習で構造体を拡張可能にできる。COMインターフェースはvtableというバイナリレイアウトゆえに公開後は不変とされ、変更は新しいIIDを持つ新インターフェースとして追加してQueryInterfaceで判別させる。事前バインディングのVB6/VBAクライアントは特にレイアウト変更で壊れやすい。.NETにはMicrosoft自身が使う互換性変更ルールがあり、バイナリ・ソース・動作互換の3層で変更を分類し、semverや強い名前のAssemblyVersion管理と組み合わせて運用する。

DLL・COMインターフェースの後方互換性の知識マップネイティブDLLのABI・エクスポート序数・cbSize慣習、COMインターフェースのvtable・IID・QueryInterfaceによる公開後不変の原則とVB6事前バインディングとの関係、そして.NETの互換性変更ルールがバイナリ・ソース・動作互換の3層およびAssemblyVersion・semverとどうつながるかを示す図利用する利用する利用する利用する前提とする利用する利用する前提とする前提とする前提とする利用する前提とする利用する前提とする前提とする両立しない利用する利用する利用する利用する利用する両立しない利用する利用する前提とする前提とするで確認できるDLL(ダイナミックリンクライブラリ)COMインターフェース.NETの互換性変更ルールABI(Application Binary Interface)呼び出し規約(calling convention)エクスポート序数(ordinal)cbSize慣習バイナリ互換COM(コンポーネントオブジェクトモデル)vtable(仮想関数テーブル)IID(インターフェース識別子)QueryInterfaceProgID(Programmatic Identifier)CLSID(Class ID)Visual Basic 6.0(VB6)VB6/VBAの事前バインディング型ライブラリ(TLB).NET(Core以降)ソース互換動作互換既定インターフェースメンバ(DIM).NET Framework強い名前(strong name)AssemblyVersionバインディングリダイレクトセマンティックバージョニング(semver)Package Validation / ApiCompat

概念間の関係(全27件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

DLL(ダイナミックリンクライブラリ)
実行時に読み込まれ、関数やデータを他のモジュールと共有できるWindowsのバイナリモジュール。
COMインターフェース
一意なIIDを持ち、vtable(関数ポインタ表)というバイナリレイアウトで実装される、COMコンポーネントが公開するメソッド契約。公開後は不変(immutable)とされる。
.NETの互換性変更ルール
Microsoftが.NETライブラリ自身の開発で使っている、public APIへの変更を許可・禁止・要判断に分類した公式ルール。
ABI(Application Binary Interface)
コンパイル済みバイナリ同士が守る取り決めで、引数の渡し方や構造体のメモリ配置、シンボル名の付け方などソースコードではなく機械語レベルの契約を指す。
COM(コンポーネントオブジェクトモデル)
公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
ProgID(Programmatic Identifier)
CLSIDに付けた、人が読める文字列の名前。`Excel.Application`のような形でCLSIDに対応付けられる。
CLSID(Class ID)
COMコンポーネントの実装(クラス)を一意に指すGUID。レジストリ上の登録の鍵になる識別子。
Visual Basic 6.0(VB6)
COMコンポーネントを型付きで呼び出せる、レガシーなVisual Basicの開発環境・言語。
VB6/VBAの事前バインディング
VB6やVBAが参照設定でCOMコンポーネントを使う際、コンパイル時にタイプライブラリを読んでvtable上の位置を焼き込む呼び出し方式。
.NET(Core以降)
.NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
既定インターフェースメンバ(DIM)
.NET Core 3.0/C# 8.0で導入された、インターフェースにメンバを追加しても既存の実装クラスに実装漏れを起こさせないための既定実装の仕組み。
強い名前(strong name)
.NETアセンブリを「名前+バージョン+カルチャ+公開鍵トークン」と署名で一意に識別する仕組み。
AssemblyVersion
ランタイムがアセンブリの識別・ロードに使う唯一のバージョン番号。強い名前付きアセンブリでは.NET FrameworkのCLRが厳密一致を要求する。
セマンティックバージョニング(semver)
互換性のない変更でMAJOR、後方互換のある機能追加でMINOR、後方互換のあるバグ修正でPATCHを上げるという、バージョン番号の付け方の規約。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。