在项目和解决方案中保持信息
当关闭项目时,即使保存了解决方案或项目,通常也会丢弃用户数据(如变量值)。 不过,Visual Studio 自动化模型提供了一种在集成开发环境 (IDE) 会话之间存储或保持此类用户数据的方法。 这是通过利用 Globals 和 Globals 属性使用 Globals 对象来完成的。 Globals 保存解决方案变量,而 Globals 保存项目变量。 每个属性都返回 Globals 对象,该对象的成员使您可以存储、检索、枚举和可选择保持数据。 进行这些操作后,下一次打开解决方案或项目时,将还原这些值。
例如,这有助于允许命令提供持久性默认值,或有助于允许此命令在被调用了数次后更改其行为。 外接程序还可以使用此功能将数据保持到 Solution (.sln) 文件中,并从 Solution (.sln) 文件中检索数据。
全局对象行为详细信息
如果 Globals 对象与 IDE 关联,则值保持在两个位置中的一个。 对于 Windows NT 4.0、Windows 2000 Professional 和 Windows Server 2003,这些值存储在 C:\winnt\Profiles\<用户名>\Application Data\Microsoft\Visual Studio\extglobal.dat 中。 对于 Windows 95、Windows 98、Windows 98 Second Edition 和 Windows Millennium Edition,如果计算机设置为让用户登录,则这些值存储在 C:\Windows\Profiles\<用户名>\Application Data\Microsoft\Visual Studio\extglobal.dat 中。 否则,将没有 <用户名> 元素。 每次关闭 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.");
}