保存專案與方案中的資訊
即使儲存了方案或專案,在關閉專案時,仍然會捨棄像是變數值等的使用者資料。 不過,Visual Studio Automation 模型提供了一種方式,可以在整合式開發環境 (IDE) 的不同工作階段之間儲存 (或保存) 這類使用者資料。 這是利用 Globals 物件,透過 Globals 和 Globals 屬性所達成的。 Globals 會保存方案變數,而 Globals 則會保存專案變數。 每個屬性都會傳回 Globals 物件,其成員可讓您儲存、擷取、列舉,及選擇性保存資料。 執行此作業後,下次再開啟方案或專案時,就會將這些值還原。
如果要讓命令提供持續性 (Persistent) 預設值,或者要在叫用指定次數後允許命令變更其行為,這將會很有用。 增益集也可以使用此功能將資料保存至方案 (.sln) 檔,以及從方案檔擷取資料。
Global 物件行為詳細資料
如果 Globals 物件與 IDE 關聯,這些值會保存在以下其中一個位置。 在 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.");
}