プロジェクトとソリューションの永続情報
プロジェクトを閉じると、ソリューションまたはプロジェクトを保存しても、変数値などのユーザー データは破棄されます。ただし、Visual Studio オートメーション モデルには、そのようなユーザー データを統合開発環境 (IDE: Integrated Development Environment) のセッション間で格納する、つまり、永続化する方法が用意されています。この方法では、Globals プロパティおよび Globals プロパティを通じて Globals オブジェクトを使用します。Globals はソリューション変数を永続化し、Globals はプロジェクト変数を永続化します。各プロパティは、データを格納、取得、および列挙でき、オプションでデータを永続化できる Globals オブジェクトを返します。データを永続化すると、次回ソリューションまたはプロジェクトを開くときに値が復元されます。
これは、コマンドを使用して永続的な既定値を指定したり、コマンドを特定の回数呼び出した後で動作を変更したりできるようにするような場合に役立ちます。また、アドインでは、この機能を使用して、ソリューション (.sln) ファイルにデータを永続化したり、このファイルからデータを取得したりできます。
グローバル オブジェクトの動作の詳細
Globals オブジェクトが IDE に関連付けられている場合、値は 2 つの場所のいずれかに永続化されます。Windows NT 4.0、Windows 2000 Professional、および Windows Server 2003 では、値は C:\winnt\Profiles\<username>\Application Data\Microsoft\Visual Studio\extglobal.dat に格納されます。Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition では、コンピューターがユーザー ログイン用にセットアップされている場合、値は C:\Windows\Profiles\<username>\Application Data\Microsoft\Visual Studio\extglobal.dat に格納されます。それ以外の場合は、<username> 要素はありません。IDE を閉じたり [すべてを保存] の操作を行ったりするたびに、IDE はグローバル値を永続化します。
Globals オブジェクトが Solution2 オブジェクトに関連付けられている場合、値は .sln ファイルで永続化されます。これらの値は、ソリューション ファイルを保存する際に永続化されます。
Globals オブジェクトが Project オブジェクトに関連付けられている場合、値はプロジェクト ファイル (.dsp、.vbp など) で永続化されます。値は、プロジェクトが保存されるときは常に永続化されます。
格納する値は、SAFEARRAY、オブジェクト、構造化されたストレージではなく、永続化できる文字列として指定する必要があります。変数が文字列に変換できない場合は、変数が永続化できない理由を説明する英語の文字列値が永続化されます。
変数が永続化されるときは、常に変数の新規レコードとその値が保存されます。
グローバル変数の永続化
次のマクロの例では、ソリューションを閉じた後に Globals オブジェクトとそのメンバーを使用して変数の値を保持する方法、およびソリューションを再び開いたときにその値にアクセスする方法を示します。このマクロは、アドインが読み込まれた回数を数えて出力します。
Sub OnAddinLoaded(ByVal dte As DTE)
' Count the number of times an add-in is loaded
' and store the value in the solution.
Dim globals As Globals
globals = dte.Solution.Globals
If globals.VariableExists("AddinLoadCounter") Then
' The counter has already been set, so increment it.
Dim int32 As System.Int32
int32 = System.Int32.Parse(CStr(globals("AddinLoadCounter")))
int32 += 1
globals("AddinLoadCounter") = int32.ToString()
Else
' Counter has never been set, so create and initialize it.
globals("AddinLoadCounter") = 1.ToString()
globals.VariablePersists("AddinLoadCounter") = True
End If
MsgBox("This add-in has been loaded: " & _
globals.VariableValue("AddinLoadCounter") & " times.")
End Sub
void OnAddinLoaded(_DTE applicationObject)
{
// Count the number of times an add-in is loaded
// and store the value in the solution.
Globals globals;
globals = applicationObject.Solution.Globals;
if(globals.get_VariableExists("AddinLoadCounter"))
{
// The counter has already been set, so increment it.
System.Int32 int32;
int32 = System.Int32.Parse((string)
globals["AddinLoadCounter"]);
int32++;
globals["AddinLoadCounter"] = int32.ToString();
}
else
{
// Counter has never been set, so create and initialize it.
globals["AddinLoadCounter"] = 1.ToString();
globals.set_VariablePersists("AddinLoadCounter", true);
}
System.Windows.Forms.MessageBox.Show("This add-in has been loaded:
" + globals.VariableValue["AddinLoadCounter"] + " times.");
}