2014-03-12 24 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属性查找其源位置。 –

相关问题