在Visual Studio中,我如何以编程方式执行“转到定义”操作?

8

给定一个表示特定类/字段/属性的字符串(例如 MyNameSpace.MyClassSystem.String.Length),我怎样才能通过编程使Visual Studio跳转到该类/字段/属性(即,使Visual Studio执行与在代码编辑器中键入引用并按下F12所发生的相同操作)?


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。 - Simon Mourier
@SimonMourier 但是如果没有包含我想要转到的文本的文本编辑器怎么办?有没有办法打开一个不可见的文本视图,它仍然绑定到同一项目,但对项目系统或其他任何东西没有任何影响,并且在调试模式下也可以工作? - Omer Raviv
一般情况下,这似乎很困难。您是要为特定软件包(例如C#文件)提供支持,还是要为所有软件包提供支持?这将是一个插件吗?还是扩展程序? - Simon Mourier
@SimonMourier 是的,我想要针对C#进行开发,你可以假设我只需要与C#项目系统交互。我正在开发一个VS扩展(vspackage)。 - Omer Raviv
1个回答

12

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

  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 - Omer Raviv
@OmerRaviv,每个调用都有如此多的参数,而没有一行代码,你怎么可能正确地实现这个?我需要在VS2013中做同样的事情,但我完全迷失了。你能提供一些代码吗?谢谢。 - JoanComasFdz
3
我已经为您将这个实现放在了Gist上:https://gist.github.com/OmerRaviv/fc3ce6fbd5b6af501f01 请注意,由于新的Roslyn语言服务并不完全向后兼容,因此此代码在VS2015中可能无法很好地工作。在VS2015中,一种更可靠和高效的方法是找到您想转到的对象的ISymbol,然后使用ISymbol.Locations属性找出其源位置。 - Omer Raviv
@OmerRaviv 感谢您提供代码片段。但是在片段中,VisualStudioServices 是从哪里来的? - smwikipedia
我想我找到了一些提示:https://learn.microsoft.com/zh-cn/visualstudio/extensibility/how-to-get-a-service - smwikipedia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接