質問: Visual Studio拡張インターフェイスの未使用のメソッド Visual Studioパッケージの IVsHierarchy インターフェイス `Unused1` 、 `Unused1` 、 `Unused2` 、 `Unused3` 、 `Unused4` 以下の説明: ``` Adds new methods without recompiling or breaking binary compatibility. ``` 誰かがこれをもっと詳しく説明できますか?これらのメソッドはどのようにして正確に役立ちますか?
回答: Visual Studio拡張オブジェクトはCOMで実装されています。 COMの難しいルールの1つは、インターフェイスが不変であることです。インタフェースを変更するには、インタフェースIIDを再割り当てする必要があります。インタフェースを識別するGUID。それは、インターフェイスを使用する誰にでも多くの痛みを引き起こします。コードを変更して再コンパイルする必要があります。 この不変性要件は、フードの下でCOMインターフェイスがメソッドアドレスのテーブルとして実装されるために必要です。クライアントコードでテーブルがどのように見えるかと、サーバーによって実装されている実際のテーブルとの間に不一致があると、災害が発生します。つまり、インタフェースがバイナリ互換でない場合です。これは、クライアントコードが間違ったメソッドを呼び出したときや、関連するメソッドがまったくないテーブルスロットを使用したときにトリガされる*非常に*、ランタイムエラーを診断するのを困難にします。これは悪名高いCOM DLL Hellの問題です。 IIDを変更するとそれが解決され、クライアントコードは古い実装を単に見つけることができなくなります。まだ厄介なエラーですが、少なくとも診断は簡単です。 プレースホルダは、マイクロソフトがインターフェイスに新しいメソッドを追加するのを許可しますが、テーブルレイアウトを破らないようにします。したがって、インタフェースの名前を変更してインタフェースIIDを再割り当てする必要はありません。したがって、アドインベンダーがアドインを再コンパイルすることはありません。新しいアドインが古いインタフェース実装を使用しようとしない限り、それはまだ動作しません。しかし、厄介なAccessViolationの代わりにまともな例外メッセージのためのオッズ。