在项目和解决方案中保持信息
当关闭项目时,即使保存了解决方案或项目,通常也会丢弃用户数据(如变量值)。不过,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.");
}