如何通过DTE监听ProjectItem的删除?

时间:2010-05-14 20:02:52

标签: visual-studio listener vsx envdte projectitem

我有一个依赖于其他解决方案项目存在的设计师。如果删除其中一个项目,设计器将崩溃,您必须编辑为XML才能修复。不完全是用户友好的。

但是,我确实有DTE对象代表Visual Studio的实例,以及我依赖的ProjectItems。

是否有可能在DTE的深处某处注册一个监听器来删除该ProjectItem?如果是的话,我该怎么做?

2 个答案:

答案 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)。