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