2014-03-12 58 views
5

給定一個表示特定類/字段/屬性的字符串(例如MyNameSpace.MyClassSystem.String.Length),如何以編程方式使Visual Studio轉到該類/字段/屬性(即,使Visual Studio執行相同的操作如果我要在代碼編輯器中輸入參考,然後按F12)?如何在Visual Studio中以編程方式執行「轉到定義」?

+1

F12/GotoDefn是一個標準Devenv命令。每個包的實現都是特定的(C++,C#,VB.NET,F#等等)。模擬這個的唯一方法是1)使用編輯器界面選擇一個文本,一個片段,任何東西,並2)運行「Edit.GoToDefinition」命令:http://stackoverflow.com/questions/20168945/how-do- i-use-dte-executecommandedit-gotodefinition-in-a-vs2010-c-macro –

+0

@SimonMourier但是如果沒有包含我想要轉到的東西的文本的文本編輯器怎麼辦?有沒有辦法打開一個不可見的文本視圖,該視圖仍然綁定到同一個項目上,但是沒有對項目系統或其他任何項目產生任何影響,並且也將以調試模式工作? –

+0

在一般情況下,這似乎很難。你是否希望這樣做來支持特定的包(C#文件可能?)或所有包?它會是一個插件嗎?一個擴展? –

回答

7

您可能需要執行以下操作。

  1. 獲取全球IVsObjectManager2接口(由SVsObjectManager對象實現)
  2. 呼叫IVsObjectManager2.FindLibrary拿到C#庫,並將結果轉換到IVsSimpleLibrary2
  3. 用正確的VSOBSEARCHCRITERIA2撥打電話IVsSimpleLibrary2.GetList2,以便找到解決方案項目中的符號。

    1. 如果所得IVsSimpleObjectList2具有GetItemCount()==1,和CanGoToSourceVSOBJGOTOSRCTYPE.GS_DEFINITION返回pfOK==true,使用GoToSource方法跳轉到源。

    2. 否則,不要跳轉到源代碼,只需向用戶顯示可能的選項。您將能夠使用IVsFindSymbol接口(由SVsObjectSearch對象實現)來實現此目的。

+1

這很好用,謝謝!在步驟3.1中,如果'GetItemCount()== 1'和'CanGoToSource'返回false,是否有任何方法可以打開該項目上的對象瀏覽器窗口,作爲「GoToSource」的替代方法? –

+0

@OmerRaviv這可能是怎麼可能的,通過這些調用的每個參數的數量,而不是一段代碼,你可以正確地實現這一點?我需要在VS2013中做同樣的事情,我完全失敗了。你能提供一些代碼嗎?謝謝。 – JoanComasFdz

+3

@JoanComasFdz我把我的這個實現放在了Gist中:https://gist.github.com/OmerRaviv/fc3ce6fbd5b6af501f01請注意,這段代碼在VS2015中不會很好,因爲新的Roslyn語言服務不是100%向後兼容。在VS2015中,更可靠和更高效的方法是找到要去的東西的ISymbol,然後使用ISymbol.Locations屬性查找其源位置。 –

相關問題