9

我正在开发一个 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();
4

2 回答 2

10

AFAIK 这样做的唯一方法是通过解决方案资源管理器工具窗口的自动化:

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”调用之前获得一个对话框。

于 2012-09-08T05:32:32.100 回答
2

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

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();
}
于 2020-04-08T09:40:37.180 回答