標籤:
Visual Studio是美國微軟公司開發的一個基本完整的開發工具集,它包括了整個軟體生命週期中所需要的大部分工具,如UML工具、代碼管控工具、整合式開發環境(IDE)等等,且所寫的目標代碼適用於微軟支援的所有平台.可以說.NET開發人員離不開它,它可以極大的提高編寫軟體的效率. Visual Studio作為一個世界級開發工具,當然支援通過外掛程式方式對其功能進行擴充,開發人員可以定製自己的外掛程式來進一步提升Visual Studio的功能.
1 什麼是Add In?
所謂的add-in就是一些被Visual Studio載入到記憶體中啟動並執行,能給使用者提供特定功能的DLL動態連結程式庫. 對於一般的開發情景來說,最常見的add-in用法就是可以通過.NET語言訪問 DTE2 對象. DTE2是Visual Studio Automation Model的頂層對象,它具有一組介面和對象可以與 Visual Studio進行互動.DTE2可以做以下這些事情:
- 訪問和調用Visual Studio內建的函數和對象
- 執行編譯
- 遍曆解決方案中的項目
- 在Visual Studio IDE中定製UI
- 擴充Visual Studio功能...
2 建立VS Add In項目
用Visual Studio 2012建立名為MyVisualStudioAddin的項目(根據嚮導進行設定,這裡不贅述),介面如下:
3 核心 Connect 類
外掛程式入口就是Connect 類,先看一下Connect的類圖:
- Connect 實現增益集對象的建構函式。請將您的初始化代碼置於此方法內。
- OnConnection 實現 IDTExtensibility2 介面的 OnConnection 方法。接收正在載入增益集的通知。
- OnDisconnection 實現 IDTExtensibility2 介面的 OnDisconnection 方法。接收正在卸載增益集的通知。
- OnAddInsUpdate 實現 IDTExtensibility2 介面的 OnAddInsUpdate 方法。當增益集集合已發生更改時接收通知。
- OnStartupComplete 實現 IDTExtensibility2 介面的 OnStartupComplete 方法。接收宿主應用程式已完成載入的通知。
- OnBeginShutdown 實現 IDTExtensibility2 介面的 OnBeginShutdown 方法。接收正在卸載宿主應用程式的通知。
- QueryStatus 實現 IDTCommandTarget 介面的 QueryStatus 方法。此方法在更新該命令的可用性時調用。
- Exec 實現 IDTCommandTarget 介面的 Exec 方法。此方法在調用該命令時調用。
- _applicationObject 是DTE2執行個體,是宿主應用程式的根對象。
- _addInInstance是當前外掛程式執行個體,表示此增益集的對象。
首先定義一些內部的對象,主要是自訂的命令,如下所示:
1 /// <summary>用於實現增益集的對象。</summary> 2 /// <seealso class=‘IDTExtensibility2‘ /> 3 public class Connect : IDTExtensibility2, IDTCommandTarget 4 { 5 #region 命令定義 除了FindInSolutionExplorer外,此處的命令不是根據功能來命令的,而是根據命令所出現的位置來命令的 6 private readonly string MY_COMMAND_FindInSolutionExplorer = "FindInSolutionExplorer"; 7 private readonly string MY_COMMAND_Project = "cmdInProject";//在項目上 8 private readonly string MY_COMMAND_Solution = "cmdInSolution";//在解決方案上 9 private readonly string MY_COMMAND_MenuBar = "cmdInMenuBar";//在功能表列上10 private readonly string MY_COMMAND_CodeWindow = "cmdInCodeWindow";//代碼視窗11 private readonly string MY_COMMAND_Files = "cmdInFiles";12 #endregion13 14 private Command findCommand = null;15 private CommandBarButton findCommandBarButtonButton = null;16 private AddInLogger logger = null;17 18 private DTE2 _applicationObject;19 private EnvDTE.AddIn _addInInstance;20 ......21 }
初始化外掛程式UI的代碼:
View Code View Code View Code View Exec Code
擷取當前IDE啟用項目的路徑:
1 /// <summary> 2 /// Gets the Active project FullPath 3 /// </summary> 4 /// <returns></returns> 5 public string GetActiveProjectFullPath() 6 { 7 // Returns the name of the currently selected project in the solution. 8 Project proj = getActiveProject(); 9 if (proj!=null)10 {11 string fullPath = proj.Properties.Item("FullPath").Value.ToString();12 return fullPath;13 // return proj.FullName;14 }15 return "";16 17 }18 /// <summary>19 /// Gets the Active project20 /// </summary>21 /// <returns></returns>22 public Project getActiveProject()23 {24 Array projects = (Array)_applicationObject.ActiveSolutionProjects;25 if (projects != null && projects.Length > 0)26 {27 return projects.GetValue(0) as Project;28 }29 projects = (Array)_applicationObject.Solution.SolutionBuild.StartupProjects;30 if (projects != null && projects.Length >= 1)31 {32 return projects.GetValue(0) as Project;33 }34 projects = (Array)_applicationObject.Solution.Projects;35 if (projects != null && projects.Length > 0)36 {37 return projects.GetValue(0) as Project;38 }39 return null;40 }
關於如何根據資料庫結構產生C# Code代碼,可以參加此文章.
4 外掛程式發布
建立了增益集後,必須先向 Visual Studio 註冊此增益集,然後才能在“增益集管理器”中啟用它。 使用具有 .addin 副檔名的 XML 檔案來完成此操作。.addin 檔案描述了 Visual Studio 在“增益集管理器”中顯示增益集所需的資訊。 在 Visual Studio 啟動時,它會尋找 .addin 檔案位置,擷取任何可用的 .addin 檔案。 如果找到相應檔案,則會讀取 XML 檔案並向“增益集管理器”提供在單擊增益集進行啟動時所需的資訊。使用增益集嚮導建立增益集時,會自動建立一個 .addin 檔案。 你也可以使用本主題中的資訊手動建立 .addin 檔案。我是用Visual Studio2012 所以將.addin檔案和對應的dll拷貝到C:\Users\wangming\Documents\Visual Studio 2012\Addins檔案下:
如果發布沒有錯誤,那麼重新啟動Visual Studio2012後,在專案檔上右擊快顯功能表,可以看到下面的介面:
同時在功能表列建立了一個JackWang的命令按鈕和工具菜單下還添加了一個MyVS增益集的命令按鈕,如:
5 代碼產生器
代碼產生器(此處用的是yuvalsol的工程,我將其整合到外掛程式中)可以根據使用者選擇的資料庫,選擇對應的表,然後產生表結構對應的C#類:
6 外掛程式卸載
如果自己定義的外掛程式想卸載怎麼辦?可參見https://msdn.microsoft.com/en-us/library/ms228765.aspx.
刪除外掛程式對應的.addin檔案. 預設路徑為..\Users\username\My Documents\Visual Studio 2012\Addins\(請根據實際情況查看具體路徑)
在 Visual Studio開發人員命令列中, 輸入devenv /resetaddin MyVisualStudioAddin.Connect 進行卸載(MyVisualStudioAddin.Connect 是MyVisualStudioAddin.AddIn檔案中的FullClassName;
至此, add-in 不會出現在IDE中,卸載完成. 但是要完整去除必須手動刪除外掛程式對應的專案檔(如果你再次調試,可能會再次進行註冊);
7 總結
通過外掛程式機制可以方便的定製VS IDE, 一般軟體公司都有自己的一套架構,其代碼也有一定的封裝,且各不相同,可以通過擴充VS,通過定製的代碼產生工具來快速產生符合本公司所需的代碼,從而從重複機械的勞動中解放出來(雖然完全自動產生的程式碼不可能直接能用,但是人工在此基礎上進行調整,也提升了代碼的編寫效率,而且減少類似於拼字/標點等人為的錯誤點等.
雖然我們不生產代碼,是代碼的搬運工,但是正確的開啟檔案是用代碼去幫我們搬運代碼!!!
Visual Studio中開發