如何在修改基础文件后以编程方式刷新/重新加载VS项目?

时间:2012-09-07 14:54:25

标签: visual-studio-2010 visual-studio vsx vsix vspackage

我正在开发一个Visual Studio包,我编写了一些代码,使得解决方案资源管理器中的文件依赖于另一个文件。

这意味着它为它们提供了与代码隐藏文件或设计器文件相同的关系,它们看起来嵌套在带有加号/减号图标的父文件下。

+ MainForm.cs


- MainForm.cs
   MainForm.Designer.cs
   MainForm.resx

我已成功编写并正确修改基础项目文件的代码,但在项目关闭并重新打开之前,更改不会反映在解决方案资源管理器中。

我正在寻找一些可以刷新或重新加载项目的代码,以便在解决方案资源管理器中立即显示更改。

更多信息......

这是sudo代码,演示了我创建依赖文件的机制。

IVsBuildPropertyStorage vsBuildPropertyStorage = GetBuildPropertyStorage();
vsBuildPropertyStorage.SetItemAttribute(projectItemIdentifier, "DependentUpon", parentFileName);

我也试过添加它以试图让项目重新加载,但它没有任何效果。

project.Save();
VSProject obj = project.Object as VSProject;
obj.Refresh();

2 个答案:

答案 0 :(得分:8)

AFAIK执行此操作的唯一方法是通过Solution Explorer工具窗口的自动化:

EnvDTE.DTE dte = ...;

string solutionName = Path.GetFileNameWithoutExtension(dte.Solution.FullName);
string projectName = project.Name;

dte.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer).Activate();
((DTE2)dte).ToolWindows.SolutionExplorer.GetItem(solutionName + @"\" + projectName).Select(vsUISelectionType.vsUISelectionTypeSelect);

dte.ExecuteCommand("Project.UnloadProject");
dte.ExecuteCommand("Project.ReloadProject");

请注意,如果项目尚未保存,则用户将在“Project.UnloadProject”调用之前获得一个对话框。

答案 1 :(得分:1)

这是我的代码(重新激活旧窗口):

public void RefreshSolutionExplorer(EnvDTE.Project activeProject, string captionOfActiveWindow)
{
  DTE2 dte2 = activeProject.DTE as DTE2;
  string solutionName = Path.GetFileNameWithoutExtension(dte2.Solution.FullName);
  string projectName = activeProject.Name;

  // Activate SolutionExplorer window
  dte2.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate();
  // Select your project to be updated
  dte2.ToolWindows.SolutionExplorer.GetItem(solutionName + @"\" + projectName).Select(vsUISelectionType.vsUISelectionTypeSelect);
  // Refresh SolutionExplorer window
  dte2.ExecuteCommand("View.Refresh", String.Empty);
  // Reactivate your old window
  dte2.Windows.Item(captionOfActiveWindow).Activate();
}