Сохранение сведений в проектах и решениях
Обновлен: Ноябрь 2007
При закрытии проекта данные пользователя, например, значения переменных, удаляются, даже если решение или проект сохраняется. Однако модель автоматизации Visual Studio предлагает способ сохранения подобных пользовательских данных в промежутках между сеансами работы в интегрированной среде разработки (IDE). Это делается при помощи объекта Globals посредством свойств Globals и Globals. Globals сохраняет переменные решения, а Globals сохраняет переменные проекта. Каждое свойство возвращает объект Globals, члены которого позволяют хранить, извлекать, перечислять и, по необходимости, сохранять данные. Если сохранить данные, то при следующем открытии решения или проекта значения будут восстановлены.
Например, это может быть удобно, когда требуется, чтобы команда предлагала сохраненное значение по умолчанию или изменяла свое поведение после определенного количества вызовов. Надстройки также могут использовать эту возможность для сохранения и извлечения данных из файлов решения (SLN).
Cведения о поведении глобального объекта
Если объект Globals связан с интегрированной средой, его значение сохраняется в одном из двух возможных мест. В 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, второе издание, Windows Millennium Edition, если компьютер настроен так, что пользователи должны входить в систему, значения хранятся в файле C:\Windows\Profiles\<имя_пользователя>\Application Data\Microsoft\Visual Studio\extglobal.dat. В противном случае элемент <имя_пользователя> отсутствует. Каждый раз при закрытии интегрированной среды разработки или при выполнении операции "Сохранить все" интегрированная среда разработки сохраняет глобальные значения.
Если объект Globals связан с объектом Solution2, значение сохраняется в SNL-файле. Эти значения сохраняются при сохранении файла решения.
Если объект 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.");
}
См. также
Задачи
Практическое руководство. Добавление и обработка команд
Практическое руководство. Создание надстройки
Пошаговое руководство. Создание мастера
Основные понятия
Диаграмма модели объектов автоматизации