How do I programmatically refresh/reload a VS proj

2020-03-03 08:31发布

问题:

I am developing a Visual Studio package and I have written some code that will make a file in Solution Explorer dependant upon another file.

What this means is that it gives them the same relationship as code-behind files or designer files, where they appear nested under the parent file with a plus/minus icon.

+ MainForm.cs


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

The code that I have written successfully and correctly modifies the underlying project file, however the change is not reflected in Solution Explorer until the project is closed and re-opened.

I'm looking for some code that will refresh or reload the project so that the change is visible in Solution Explorer immediately.

Further Information...

Here is the sudo code that demonstrates the mechanism by which I create the dependant file.

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

I have also tried adding this in an attempt to get the project to reload, but it doesn't have any effect.

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

回答1:

AFAIK the only way of doing this is via automation of the Solution Explorer tool-window:

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");

Note that, if the project hasn't been saved, the user will get a dialog box prior to the "Project.UnloadProject" call.