Visual studio 2010 如何在修改基础文件后以编程方式刷新/重新加载VS项目?
我正在开发一个VisualStudio软件包,并编写了一些代码,使解决方案资源管理器中的文件依赖于另一个文件 这意味着它为它们提供了与代码隐藏文件或设计器文件相同的关系,其中它们嵌套在父文件下,并带有加号/减号图标Visual studio 2010 如何在修改基础文件后以编程方式刷新/重新加载VS项目?,visual-studio-2010,visual-studio,vsx,vsix,vspackage,Visual Studio 2010,Visual Studio,Vsx,Vsix,Vspackage,我正在开发一个VisualStudio软件包,并编写了一些代码,使解决方案资源管理器中的文件依赖于另一个文件 这意味着它为它们提供了与代码隐藏文件或设计器文件相同的关系,其中它们嵌套在父文件下,并带有加号/减号图标 + MainForm.cs - MainForm.cs MainForm.Designer.cs MainForm.resx 我成功编写的代码正确地修改了基础项目文件,但是在项目关闭并重新打开之前,更改不会反映在解决方案资源管理器中 我正在寻找一些可以刷新或重新加载
+ 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();
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”调用之前获得一个对话框。以下是我的代码(重新激活旧窗口):
您是如何找到用于projectItemIdentifier的值的?您是否找到了一个好的刷新解决方案,而不需要卸载项目?@Colin这是一种通过手动操作项目文件的XML在项目内进行更改的非常粗暴的方法。重新加载将是必需的,但我从来没有找到一个好方法来做到这一点。更好的方法是在VSAPI(EnvDTE)中找到正确的操作并调用它。通过API更健壮,VS将负责任何必要的重新加载。你想做什么手术?如果是添加依赖文件,那么我可以帮上忙。@Colin抱歉,我帮不上忙projectItemIdentifier。我最终没有使用这个或任何类似的代码。VSAPI更面向对象,通过提供ProjectItem对象而不是标识符字符串来工作。可以通过迭代project.ProjectItems属性来检索项目项(实际上是项目中的文件和文件夹)。如果您真的需要projectItemIdentifier,那么我建议调试并查看ProjectItem对象的属性。这是令人困惑的部分。ProjectItem没有与projectItemIdentifier预期的参数明确相关的属性,我可以告诉您。出于好奇,您是否找到了“VSAPI的正确操作”?我没有,这是我见过的最接近的解决方案。你能试试吗?我在VS 2012中测试并正常工作(我使用我的自定义加载项VS将其称为)。和非对话框均未显示重新加载对话框(项目已保存并在源代码管理TFS中)在VS 2017中尝试此操作,当它到达
dte.Windows
时,我得到以下错误:System.Runtime.Serialization.SerializationException:在程序集“Microsoft.VisualStudio.Platform.WindowManagement.dte.Windows”中键入“Microsoft.VisualStudio.Platform.WindowManagement”,版本=15.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'未标记为可序列化。
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();
}