3

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

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

是否可以在 DTE 深处的某个地方注册一个侦听器以删除该 ProjectItem?如果是这样,我该怎么做?

4

2 回答 2

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;
于 2011-03-10T23:51:39.010 回答
1

查看此常见问题解答文章,该文章解释了如何注册 ProjectItems 事件(包括 ItemDeleted)。

于 2010-05-15T01:52:37.890 回答