我有一个设计师,它依赖于其他解决方案项目的存在。如果其中一项被删除,设计器会崩溃,您必须将其编辑为 XML 才能修复。不完全是用户友好的。
但是,我确实有代表 Visual Studio 实例的 DTE 对象,以及我所依赖的 ProjectItems。
是否可以在 DTE 深处的某个地方注册一个侦听器以删除该 ProjectItem?如果是这样,我该怎么做?
我有一个设计师,它依赖于其他解决方案项目的存在。如果其中一项被删除,设计器会崩溃,您必须将其编辑为 XML 才能修复。不完全是用户友好的。
但是,我确实有代表 Visual Studio 实例的 DTE 对象,以及我所依赖的 ProjectItems。
是否可以在 DTE 深处的某个地方注册一个侦听器以删除该 ProjectItem?如果是这样,我该怎么做?
看起来这里的罪魁祸首是垃圾收集。我发现以下两个事件集的行为相同。
Events2 events2 = dte.Events as Events2;
if (events2 != null)
{
this.projectItemsEvents = events2.ProjectItemsEvents;
this.projectItemsEvents.ItemAdded += this.ProjectItemsEvents_ItemAdded;
this.projectItemsEvents.ItemRemoved += this.ProjectItemsEvents_ItemRemoved;
this.projectItemsEvents.ItemRenamed += this.ProjectItemsEvents_ItemRenamed;
}
this.csharpProjectItemsEvents =
dte.Events.GetObject("CSharpProjectItemsEvents") as ProjectItemsEvents;
if (this.csharpProjectItemsEvents != null)
{
this.csharpProjectItemsEvents.ItemAdded += this.CSharpProjectItemsEvents_ItemAdded;
this.csharpProjectItemsEvents.ItemRemoved += this.CSharpProjectItemsEvents_ItemRemoved;
this.csharpProjectItemsEvents.ItemRenamed += this.CSharpProjectItemsEvents_ItemRenamed;
}
两者的关键是确保在订阅者中保留对事件对象的引用。一旦我添加了参考,他们的行为就像我预期的那样。
private ProjectItemsEvents projectItemsEvents;
private ProjectItemsEvents csharpProjectItemsEvents;
查看此常见问题解答文章,该文章解释了如何注册 ProjectItems 事件(包括 ItemDeleted)。