ユーザーが Visual Studio ソリューションを再度開くと、関連付けられているドキュメントのほとんどはすぐには読み込まれません。 ドキュメント ウィンドウ フレームは保留中の初期化状態で作成され、プレースホルダー ドキュメント (スタブ フレームと呼ばれます) が実行中のドキュメント テーブル (RDT) に配置されます。
拡張機能を使用すると、読み込まれる前にドキュメント内の要素にクエリを実行することで、プロジェクト ドキュメントが不必要に読み込まれる可能性があります。これにより、Visual Studio の全体的なメモリ占有領域が増加する可能性があります。
ドキュメントの読み込み
スタブ フレームとドキュメントは、ウィンドウ フレームのタブを選択するなどして、ユーザーがドキュメントにアクセスすると完全に初期化されます。 ドキュメントは、RDT に直接アクセスしてドキュメント データを取得するか、次のいずれかの呼び出しを行って RDT に間接的にアクセスすることによって、ドキュメントのデータを要求する拡張機能によって初期化することもできます。
ウィンドウ フレーム Show メソッド。
ウィンドウ フレーム GetProperty 次のいずれかのプロパティに対するメソッドです。
拡張機能でマネージド コードを使用する場合は、ドキュメントが保留中の初期化状態でないか、ドキュメントを完全に初期化する必要がある場合を除き、 GetDocumentInfo を呼び出さないでください。 その理由は、メソッドが常に doc データ オブジェクトを返し、必要に応じて作成するためです。 代わりに、
IVsRunningDocumentTable4インターフェイスでいずれかのメソッドを呼び出す必要があります。拡張機能で C++ を使用している場合は、不要なパラメーターに
nullを渡すことができます。他のプロパティを要求する前に関連するプロパティを要求する前に、次のいずれかのメソッドを呼び出すことで、不要なドキュメントの読み込みを回避できます。
GetProperty __VSFPROPID6.VSFPROPID_PendingInitialization を使用します。
GetDocumentFlags。 このメソッドは、ドキュメントがまだ初期化されていない場合に<_VSRDTFLAGS4.RDT_PendingInitialization>を含む
オブジェクトを返します。
ドキュメントが完全に初期化されたときに発生する RDT イベントをサブスクライブすることで、ドキュメントが読み込まれた日時を確認できます。 次の 2 つの可能性があります。
イベント シンクで IVsRunningDocTableEvents2が実装されている場合は、 OnAfterAttributeChangeExをサブスクライブできます。
それ以外の場合は、 OnAfterAttributeChangeをサブスクライブできます。
次の例は、架空のドキュメント アクセス シナリオです。Visual Studio 拡張機能では、開いているドキュメントに関する情報 (編集ロック数やドキュメント データに関する情報など) を表示する必要があります。 IEnumRunningDocumentsを使用して RDT 内のドキュメントを列挙し、各ドキュメントのGetDocumentInfoを呼び出して、編集ロック数とドキュメント データを取得します。 ドキュメントが初期化保留中の状態の場合、ドキュメント データを要求すると、不必要に初期化されます。
ドキュメントにアクセスするより効率的な方法は、 GetDocumentEditLockCount を使用して編集ロック数を取得し、 GetDocumentFlags を使用してドキュメントが初期化されているかどうかを判断することです。 フラグに_VSRDTFLAGS4が含まれていない場合 。RDT_PendingInitialization、ドキュメントは既に初期化されており、 GetDocumentData を使用してドキュメント データを要求しても、不要な初期化は発生しません。 フラグに_VSRDTFLAGS4が含まれている場合 。RDT_PendingInitialization、拡張機能は、ドキュメントが初期化されるまでドキュメント データを要求しないようにする必要があります。 この初期化は、 OnAfterAttributeChange(Ex) イベント ハンドラーで検出できます。
拡張機能をテストして、初期化を強制するかどうかを確認する
ドキュメントが初期化されているかどうかを示す目に見える手掛かりがないため、拡張機能が初期化を強制しているかどうかを調べるのが難しい場合があります。 完全に初期化されていないすべてのドキュメントのタイトルにタイトルに テキスト [スタブ] が含まれるため、検証を容易にするレジストリ キーを設定できます。
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\BackgroundSolutionLoadで、StubTabTitleFormatString を {0} [Stub] に設定します。