-2

ビジュアルスタジオ2017 sdkでプロジェクト保存イベントをインターセプトすることは可能ですか?ビジュアルスタジオ2017 sdkでプロジェクト保存イベントをインターセプトする方法は?

UPDATE

私は現在、私はどんな変化が永続化されたときに知っておく必要があるのVisual Studio 2017の拡張機能を開発しています。

例:プロジェクトに新しい参照を追加すると(参照が追加/変更/削除されたが、私の必要性に合致しないためのイベントがあることがわかっています)、プロジェクトは保留とマークされて保存されます。私はそれが保存されるときにそれを傍受する必要があります(保存する前なら良い)。

私はDte.Events.DocumentEvents.DocumentSavedイベントを試しましたが、保存プロジェクトでは起動されません。 DTE.Events.SolutionEventsおよびDTE.Events.SolutionItemEventsには、必要なタイプのイベントはありません。

可能でしょうか?

+0

私は答えを投稿した場合*はい、それが可能だ*は、それは私がすべての詳細を追加することなく、十分でしょうか?そうでなければ、あなたの質問はあまりにも漠然としていて、範囲が広いので、あなたが求めていることをより具体的にするために[編集]するべきです。 –

+0

@KenWhiteあなたが正しいです!私は自分の質問を編集しました... –

+0

もっと良いです。私の投票結果を取り下げる。ありがとう。 –

答えて

1

この場合、正しいものがOnBeforeSaveメソッドをオーバーライドIVsRunningDocTableEvents3を実現使用することであろう。

このようにして、プロジェクトがいつ保存され、必要なものが実行されるかを正確に知ることができます。

例:

uint cookie; 
var runningDocumentTable = (IVsRunningDocumentTable)GetGlobalService(typeof(SVsRunningDocumentTable)); 

runningDocumentTable.AdviseRunningDocTableEvents(new RunningDocTableEventsHandler(), out cookie); 
using Microsoft.VisualStudio; 
using Microsoft.VisualStudio.Shell; 
using Microsoft.VisualStudio.Shell.Interop; 

namespace YourProject 
{ 
    internal class RunningDocTableEventsHandler : IVsRunningDocTableEvents3 
    { 

     #region Methods 

     public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnAfterSave(uint docCookie) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnAfterAttributeChange(uint docCookie, uint grfAttribs) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew) 
     { 
      return VSConstants.S_OK; 
     } 

     public int OnBeforeSave(uint docCookie) 
     { 
      /////// MY CODE //////// 
      return VSConstants.S_OK; 
     } 

     #endregion Methods 
    } 
} 
0

DTE.Events.DocumentEventsは、プロジェクトシステム全体ではなく、開いているプロジェクトファイルで動作します。ソリューションエクスプローラにロードされて表示される各プロジェクトは、そのプロジェクトタイプのプロジェクトシステムによってロードされます。プロジェクトの異なるバージョンには独自のプロジェクトシステム実装があります。

要件に応じて、IVsSolutionEvents3を実装して、ロード/アンロード中のプロジェクトを通知する必要があります。そのオブジェクトをSVsSolutionBuildManagerサービスを介してパッケージ初期化コードのリスナーとして登録します。

次に、プロジェクトの変更を通知するIVsHierarchyEventsを実装し、イベントリスナーオブジェクトを登録するためにIVsSolutionEvents3のOnAfterProjectOpen実装に渡されるIVsHierarchyオブジェクトに対してAdviseHierarchyEventsを呼び出します。

詳細な説明は、下のスレッドを参照してください。

Visual Studio SDK - Handling File Add, Remove, and Rename Events

+0

私は上記のように実装することができましたが、まだプロジェクトを保存するイベントはありません。そこに存在するメソッドは何度も起動され、必要なものにうまく収まりません。 別の方法がありますか? 存在しない場合は、 'IVsHierarchyEvents'を実装してプロジェクトが保存されたことをどのように識別できますか? –

+0

リスナーを追加して、OnItemAdded()メソッドを監視することができます。たとえば、OnItemAdded()メソッドでbool変数を設定できます。 OnItemAddedが呼び出されると、bool変数はtrueに設定されます。これは、プロジェクト階層が変更されたことを意味します。 –

関連する問題