本文章是由機器翻譯。

Visual Studio 2013

擴大Visual Studio2013年副檔名

Doug Erickson
Susan Norwood

在更高級別的版本的Visual Studiobestfeatures 之一,現已提供給每個人都為免費通過Visual Studio社區 2013 IDE:從Visual Studio庫使用擴展的能力 (查找在擴展 bit.ly/115mBzm)。那麼哪些擴展呢?它們允許您擴展Visual Studio社區 2013年的外掛程式 (您可以在下載 bit.ly/1tH2uyc) 和功能的Visual Studio執行新的任務,添加新的功能和重構代碼,— — 或甚至支援新的語言。

微軟開發者社區提供種類繁多的擴展Visual Studio畫廊。看,你會很驚訝的各種可用擴展。其中的一些,像生產力電力工具 2013年副檔名 (在下載 bit.ly/1xE3EAT),您可能不希望生活中沒有。您可以從 Web 安裝這些擴展或者你可以搜索內Visual Studio線上擴展使用在工具功能表中的擴展和更新視窗。看看線上的類別,以找到更受歡迎的工具,如視覺協助和 ReSharper。你甚至可以找到更多的擴展,在代碼庫 (bit.ly/11nzi9Q)。

您想要執行或自動執行 IDE 中的具體任務,即使是最好的工具可能不完全映射。你可能有你自己個人的腳本,您已經自訂並調整,以使您的工作更容易。也許你有一個檢查成功生成的組建目錄或運行轉換 XML 檔或清理所有碎屑的複雜的構建過程。你想要運行您在Visual Studio的工具,作為 IDE 的一部分或作為生成過程的一部分?現在你可以使用Visual Studio2013年社區和Visual Studio2013 SDK。

您可以立即開始下載 SDKVisual Studio。它提供所有庫、 工具和專案範本創建各種不同的副檔名。往前走並安裝它,你會準備好了。

設置工具運行在Visual Studio

一旦你有了 SDK 安裝,就很容易使你的工具或從Visual Studio功能表運行的可執行腳本。無處不在的 Notepad.exe 將這篇文章的示例,但您可以使用任何可執行檔或整合自己的命令處理常式中的代碼。

一個基本的擴展是一個Visual Studio包二進位。您可以找到Visual Studio包範本在新建專案對話方塊中,根據Visual Basic|可擴充性、 C# |可擴充性或其他專案類型 |可擴充性。

本文將展示如何使啟動記事本的簡單擴展。我們將使用該範本在下 C# / 可擴充性來創建一個 C#Visual Studio包專案。我們會把它放在 D:\Code 目錄中,並稱之為 StartNotepad。此擴展最終將從Visual StudioIDE 功能表項目啟動記事本。

一旦您按兩下該範本,Visual Studio將啟動一個嚮導,説明您配置的擴展。對於初學者來說,只是接受第一次的兩個對話方塊頁面上的預設設置。

下一步,採取以下步驟:

  1. 在選擇 VSPackage 選項頁中,選擇功能表命令選項。
  2. 在命令選項頁上,將命令名稱設置為啟動記事本和 cmdidStartNotepad 的命令 ID。
  3. 在測試選項頁上,取消選中兩個核取方塊。
  4. 按一下 [完成]。

在這一點上,您可以生成並運行包專案。當專案打開時,在開始調試 (按 F5 鍵或使用工具列上的啟動命令)。Visual Studio社區 2013年新實例將啟動。完成後,您將看到帶有預設起始頁 — — 微軟Visual Studio— — 實驗實例的標題列上的 IDE (見圖 1)。這是您的Visual Studio的測試實例。它分別從Visual Studio,你工作實例運行,所以你不必擔心污染您自己的開發環境,如果出了什麼差錯。

Visual Studio實驗實例
圖 1 Visual Studio實驗實例

"實驗實例"是真的只是花裡胡哨的宣佈你們已經推出Visual Studio沙箱實例用於測試您的擴展。它有Visual Studio社區到 2013 年,所有的功能,但那不會危及你的工作,在原始的Visual Studio實例。對於這個簡單的示例,它似乎有點過分了。然而,如果你建立一個整個設計框架或一套複雜的相互依存的生成工具,你不想通過運行在相同的實例,從中您正在開發的風險您的代碼。

在的實驗實例工具功能表,打開擴展和更新視窗。您應該會看到這裡的 StartNotepad 擴展 (見圖 2)。(如果您打開擴展和更新您的Visual Studio的工作實例,您不會看到 StartNotePad)。

擴展和更新顯示 StartNotepad
圖 2 擴展和更新顯示 StartNotepad

您還會看到啟動記事本,在工具功能表下 (見圖 3)。

新的功能表項目目確認為工具下的 StartNotepad 的
圖 3 新的功能表項目目確認為工具下的 StartNotepad 的

現在轉到工具功能表中的實驗實例中。您應該看到啟動記事本命令。在這一點上它只是彈出一個訊息方塊,說:"StartNotepad — — MSIT 裡面。StartNotepad.StartNotepadPackage.MenuItemCallback()"。你會看到如何實際上此命令在下一節從啟動記事本。

設置功能表命令

停止調試並回到您的Visual Studio的工作實例。打開 StartNotepadPackage.cs 檔,其中包含派生的包裝類。這是所有 VSPackage 副檔名的起始點。此類的初始化方法實際上是設置該命令:

// Add our command handlers for menu (commands must exist in the .vsct file)
OleMenuCommandService mcs =
  GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if ( null != mcs )
{
  // Create the command for the menu item.
  CommandID menuCommandID = new CommandID(GuidList.guidStartNotepadCmdSet,
    (int)PkgCmdIDList.cmdidStartNotepad);
  MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
  mcs.AddCommand( menuItem );
}

Don現在擔心這段代碼的詳細資訊。您應該注意到這是如何的功能表命令具現化。定義的功能表和其他 UI VSPackage 擴展,正如代碼注釋說,在.vsct 檔中。

命令處理常式是命名為 MenuItemCallback,(在同一個 StartNotepadPackage 類)。刪除現有的方法,添加以下內容:

private void MenuItemCallback(object sender, EventArgs e)
{
  Process proc = new Process();
  proc.StartInfo.FileName = "notepad.exe";
  proc.Start();
}

現在試試看。當你開始調試該專案,按一下工具 |啟動記事本,你應該看到記事本實例。事實上,你會得到一個新的記事本實例每次您按一下啟動記事本。

您可以使用 System.Diagnostics.Process 類的一個實例運行任何可執行檔,而不僅僅是記事本。試一試與 calc.exe,舉個例子。

定義的介面

現在您將使用.vsct 檔來定義您的擴展的 UI。看看 StartNotepad.vsct 檔。這是一個方便的地方,要找到的Visual StudioUI,您會在您的擴展中使用的所有定義。它是一個 XML 檔,所以振作起來角括弧。

查找 <組> 塊。每個功能表命令必須屬於一個組,告訴Visual Studio在何處放置該命令。在這種情況下,該命令位於工具功能表上和其父是主功能表:

<Groups>
  <Group guid="guidStartNotepadCmdSet" 
    id="MyMenuGroup" priority="0x0600">
    <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
  </Group>
</Groups>

Don不要擔心太多的細節尚未。這是只是為了顯示你的重要的元素在哪裡。命令本身定義內 <按鈕> 塊:

<Button guid="guidStartNotepadCmdSet" id="cmdidStartNotepad"
  priority="0x0100" type="Button">
  <Parent guid="guidStartNotepadCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <Strings>
    <ButtonText>Start Notepad</ButtonText>
  </Strings>
</Button>

您可以看到該按鈕定義一個 GUID (guidStartNotepadCmdSet,是組 GUID 相同) 和 ID (cmdidStartNotepad,是您在包嚮導中指定的 ID)。該命令為父級到組。它有一個圖示和一些文本。該圖示是一組預設的解決方案中包含的圖示之一。優先順序指定此按鈕的位置在功能表上,如果在命令組中有多個命令。在 <符號> 中定義的 Guid 和 Id 的組和按鈕 塊:

<!-- This is the package GUID. -->
<GuidSymbol name="guidStartNotepadPkg"
  value="{18311db7-ca0f-419c-82b0-5aa14c8b541a}" />
<!-- This is the GUID used to group the menu commands together -->
<GuidSymbol name="guidStartNotepadCmdSet"
  value="{b0692a6d-a8cc-4b53-8b2d-17508c87f1ab}">
  <IDSymbol name="MyMenuGroup" value="0x1020" />
  <IDSymbol name="cmdidStartNotepad" value="0x0100" />
</GuidSymbol>

點陣圖也被定義在 <符號> 塊:

<GuidSymbol name="guidImages" 
  value="{b8b810ad-5210-4f35-a491-c3464a612cb6}" >
  <IDSymbol name="bmpPic1" value="1" />
  <IDSymbol name="bmpPic2" value="2" />
  <IDSymbol name="bmpPicSearch" value="3" />
  <IDSymbol name="bmpPicX" value="4" />
  <IDSymbol name="bmpPicArrows" value="5" />
  <IDSymbol name="bmpPicStrikethrough" value="6" />
</GuidSymbol>

試著更改圖示為在此處定義的其他部分。在沒有任何選擇都是特別適合於記事本,所以選擇刪除線,因為它顯示了安裝程式的另一部分。雖然在 <符號> 中定義圖示 塊,它們也必須列在 <點陣圖> 的 usedList 屬性 塊:

<Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1,
  bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>

你看到 bmpPicStrikethrough 沒有列出,雖然它已經被定義。如果你將圖示更改為此點陣圖,它不會出現在功能表上。所以添加 bmpPicStrikethrough:

<Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1,
  bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows, bmpPicStrikethrough"/>

現在你可以將圖示更改為 bmpPicStrikethrough 的功能表按鈕:

<Button guid="guidStartNotepadCmdSet" id="cmdidStartNotepad"
  priority="0x0100" type="Button">
  <Parent guid="guidStartNotepadCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPicStrikethrough" />
  <Strings>
    <ButtonText>Start Notepad</ButtonText>
  </Strings>
</Button>

現在你可以試試看。當實驗實例時,您應該看到類似圖 4 在工具功能表上。

命令以啟動記事本
圖 4 命令以啟動記事本

現在,添加啟動記事本功能表命令的鍵盤快速鍵。本示例將使用 Ctrl + 1。 如果您添加鍵盤快速鍵,一定要選擇晦澀的鍵組合,所以您的命令不碰撞與多個標準相結合。你可以完全在.vsct 檔中。鍵盤快速鍵被稱為.vsct 檔中的鍵綁定。將下面的塊添加到.vsct 檔:

<KeyBindings>
  <KeyBinding guid="guidStartNotepadCmdSet" 
    id="cmdidStartNotepad"    
    editor="guidVSStd97" key1="1" mod1="CONTROL"/>
</KeyBindings>

Key1 屬性聲明的標準的關鍵,並 mod1 屬性聲明修飾符或加速器鍵 (通常是 ctrl 鍵、 alt 鍵或 Shift) 與標準鍵同步選取。如果您添加 mod2 ="ALT" 若要添加第二個修改鍵,你還會有 Ctrl + Alt + 1 作為其快捷方式。現在堅持使用 Ctrl + 1。請記住,雖然,.vsct 檔是一個很好的地方,開始您的自訂。現在,您可以開始調試。重新開機包。當實驗實例時,點擊 Ctrl + 1。 你應該得到記事本的實例。

保持 UI 的回應

MenuItemCallback 方法因為它目前存在不阻塞 UI 執行緒。你仍然可以啟動記事本命令 (或 Ctrl + 1) 啟動記事本。你還可以做Visual StudioIDE 中的事情。您可以移動視窗,按一下其他命令的功能表上,等等。想像一下你的工具需要你退出處理常式之前完成其工作。換句話說,您需要調用 Process.WaitForExit。

不幸的是,如果此時正 MenuItemCallback 的Visual StudioUI 執行緒上調用 WaitForExit,整個的Visual StudioUI 凍結。在行動中簽出。在 MenuItemCallback 方法中,調用 WaitForExit:

private void MenuItemCallback(object sender, EventArgs e)
{
  Process proc = new Process();
  proc.StartInfo.FileName = "notepad.exe";
  proc.Start();
  proc.WaitForExit();
}

開始調試,和當實驗實例時,點擊 Ctrl + 1。 您應該看到記事本實例。現在,嘗試移動Visual Studio視窗 (實驗組)。它不會移動。你不能和別的Visual StudioUI,要麼做你甚至可以看到快顯視窗說:"微軟Visual Studio是忙"。顯然,這是有些東西你需要修理。

幸運的是,該修補程式是簡單的。如果你有一種工具或一個過程,將需要花費大量的時間來完成,它包裹在一項任務在 MenuItemCallback,像這樣:

private void MenuItemCallback(object sender, EventArgs e)
{
  ThreadHelper.JoinableTaskFactory.RunAsync(async delegate
  {
    Process proc = new Process();
    proc.StartInfo.FileName = "notepad.exe";
    proc.Start();
    await proc;
  });
}

現在您應該能夠運行您的工具和在同一時間在Visual Studio工作。

清理你的實驗

如果您正在開發多個副檔名,或只探索成果與您的擴展代碼的不同版本,你實驗的環境可能會停止工作它應該的方式。在這種情況下,您應該運行該重置腳本。

此腳本被稱為重置Visual Studio2013年實驗實例,它的船隻作為Visual Studio2013 SDK 的一部分。此腳本從移除所有引用到您的擴展的實驗環境以便您可以從頭開始。你可以到此腳本中兩種方法之一:

  • 從桌面,找到重置Visual Studio2013年實驗實例
  • 從命令列運行下面的命令:
<VSSDK installation>\VisualStudioIntegration\Tools\Bin\
        CreateExpInstance.exe /Reset /VSInstance=12.0 
       /RootSuffix=Exp && PAUSE

部署您的擴展

現在,您的工具擴展運行,因為它應該,它是時間去思考它分享給你的朋友和同事。那很簡單,只要他們有Visual Studio2013 安裝。所有你必須做是送你建的.vsix 檔。一定要建立在發佈模式下。

你可以找到對這種副檔名的.vsix 檔 StartNotepad bin 目錄中。假設你已經建立了發佈配置,它將在 \D:\Code\StartNotepad\StartNotepad\bin\Release\StartNotepad.vsix。

若要安裝的擴展,使用者需要要關閉所有打開的Visual Studio,實例,然後按兩下.vsix 檔以造就 VSIX 安裝程式。將檔案複製到 %LocalAppData%\­Microsoft\VisualStudio\12.0\Extensions 目錄。

當使用者再次帶來了Visual Studio時,他就會發現 StartNotepad 擴展工具 |擴展和更新。他可以去擴展和更新,以卸載或禁用擴展。

學習如何創建擴展允許您使Visual Studio經驗真正成為你自己。它還允許您與社區分享您的最佳的工作效率增強功能和特點。微軟也很喜歡它當你發佈你的擴展。

總結

本文描述了一小部分你可以用Visual Studio擴展。要瞭解更多有關Visual Studio擴展報告一般情況下,請參閱"整合你的應用程式或服務和與Visual Studio頁上 bit.ly/1zoIt59

更詳細的視圖,請參閱 MSDN 庫文章在"擴大Visual Studio概述"一節下的 bit.ly/1xWoA4k。要用於生成了這方面的知識一些好的代碼樣本,請查閱 MSDN 示例庫在對樣品的收集和 bit.ly/1xWp5eD。一旦你已經建立,並且共用一些擴展,你真正可以自訂您的Visual Studio環境。


Susan Norwood 曾在微軟,大多寫一本關於Visual StudioSDK。她説明了很多人得到他們的工具集成到Visual Studio。

Doug Erickson 13 年曾作為一個開發人員和技術作家在微軟。他期待著開發人員會與Visual Studio社區開發的應用程式和遊戲的所有平臺。

感謝以下的微軟技術專家對本文的審閱:Anthony 坎賈洛西和RyanMolden