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