3

他のソリューションアイテムの存在に依存するデザイナーがいます。これらのアイテムの1つが削除されると、デザイナーがクラッシュし、修正するにはXMLとして編集する必要があります。必ずしもユーザーフレンドリーではありません。

ただし、私はVisual Studioのインスタンスを表すDTEオブジェクトと、依存しているProjectItemsを持っています。

DTEのどこかで、そのProjectItemを削除するためのリスナーを登録することは可能ですか?そして、もしそうなら、私はそれをどのように行うでしょうか?

4

2 に答える 2

3

ここでの原因はガベージコレクションのようです。次の2つのイベントセットが同じように動作することがわかりました。

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を含む)の登録方法を説明しているこのFAQ記事を確認してください。

于 2010-05-15T01:52:37.890 に答える