我有一个依赖于其他解决方案项目存在的设计师。如果删除其中一个项目,设计器将崩溃,您必须编辑为XML才能修复。不完全是用户友好的。
但是,我确实有DTE对象代表Visual Studio的实例,以及我依赖的ProjectItems。
是否有可能在DTE的深处某处注册一个监听器来删除该ProjectItem?如果是的话,我该怎么做?
答案 0 :(得分:3)
看起来这里的罪魁祸首是垃圾收集。我发现以下两个事件集的行为相同。
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;
答案 1 :(得分:1)
查看this FAQ article,其中解释了如何注册ProjectItems事件(包括ItemDeleted)。