-2

可以在Visual Studio 2017 sdk中攔截項目保存事件嗎?如何攔截visual studio 2017 sdk中的項目保存事件?

UPDATE

我目前正在開發的Visual Studio 2017年的擴展,在我需要的時候任何變化堅持就知道了。例如:當我在項目中添加一個新的引用(我知道有引用添加/更改/刪除但未滿足需要的事件時),項目被標記爲待保存。當它被保存時我需要攔截它(如果它在保存之前更好)。

我嘗試了Dte.Events.DocumentEvents.DocumentSaved事件,但它並未在保存項目中被觸發; DTE.Events.SolutionEventsDTE.Events.SolutionItemEvents沒有我需要的類型的事件。

有可能嗎?

+0

如果我發佈答案*是的,這是可能的*,將是足以沒有我添加任何細節?如果不是的話,那麼你的問題就是範圍過於模糊和廣泛,你應該[編輯]更具體地說明你在問什麼。 –

+0

@KenWhite你是對的!我編輯了我的問題... –

+0

好多了。撤回我的近距離投票。謝謝。 –

回答

1

正確的在這種情況下是使用實施IVsRunningDocTableEvents3重寫OnBeforeSave方法。

通過這種方式,我確切地知道何時需要保存項目並執行所需的項目。

例:

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以通知項目更改並將IVSHierarchy對象上的Call AdviseHierarchyEvents傳遞給IVsSolutionEvents3的OnAfterProjectOpen實現,以註冊事件偵聽器對象。

更詳細的解釋請參考下面的主題。

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

+0

我能夠按照上述方式實施,但是,仍然沒有事件可以保存項目。那裏存在的方法被激發了好幾次,並且不適合我需要的東西。 還有別的辦法嗎? 如果它不存在,我如何通過實現'IVsHierarchyEvents'來確定項目已經保存? –

+0

您可以添加一個偵聽器來監視OnItemAdded()方法。例如,你可以在OnItemAdded()方法中設置一個bool變量。當OnItemAdded調用時,bool變量將被設置爲true,這意味着項目層次結構已被更改。 –

相關問題