【问题标题】:How can I perform "Go To Definition" programmatically in Visual Studio?如何在 Visual Studio 中以编程方式执行“转到定义”?
【发布时间】:2014-03-12 07:37:59
【问题描述】:

给定一个代表特定类/字段/属性的字符串(例如MyNameSpace.MyClassSystem.String.Length),我如何以编程方式使 Visual Studio 转到该类/字段/属性(即,让 Visual Studio 执行如果我在代码编辑器中输入引用然后按 F12)会发生同样的事情吗?

【问题讨论】:

  • F12/GotoDefn 是标准的 DevEnv 命令。每个包的实现都是特定的(C++、C#、VB.NET、F# 等等)。模拟这种情况的唯一方法是 1) 使用编辑器界面选择文本、sn-p 和任何内容,以及 2) 运行“Edit.GoToDefinition”命令:stackoverflow.com/questions/20168945/…
  • @SimonMourier 但是如果没有包含我想去的东西的文本的文本编辑器怎么办?有没有办法打开一个不可见的文本视图,它仍然绑定到同一个项目,但对项目系统或其他任何东西没有任何影响,并且也可以在调试模式下工作?
  • 在一般情况下,这似乎很困难。您是否希望这样做以支持特定包(可能是 C# 文件?)或所有包?会是插件吗?扩展?
  • @SimonMourier 是的,我正在寻找专门针对 C# 的目标,您可以假设我只需要与 C# 项目系统交谈。我正在开发一个 VS 扩展(一个 vspackage)。

标签: c# envdte vsx visual-studio-macros


【解决方案1】:

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

  1. 获取全局IVsObjectManager2接口(由SVsObjectManager对象实现)
  2. 调用IVsObjectManager2.FindLibrary获取C#库,并将结果转换为IVsSimpleLibrary2
  3. 使用正确的VSOBSEARCHCRITERIA2 调用IVsSimpleLibrary2.GetList2,以便在项目中为您的解决方案找到符号。

    1. 如果生成的IVsSimpleObjectList2GetItemCount()==1,并且CanGoToSourceVSOBJGOTOSRCTYPE.GS_DEFINITION 返回pfOK==true,则使用GoToSource 方法跳转到源。

    2. 否则,与其跳转到源,只需向用户显示可能的选项。为此,您将能够使用IVsFindSymbol 接口(由SVsObjectSearch 对象实现)。

【讨论】:

  • 这很好用,谢谢!在步骤 3.1 中,如果 GetItemCount() == 1CanGoToSource 返回 false,有没有办法在该项目上打开对象浏览器窗口,作为 GoToSource 的替代方法?
  • @OmerRaviv 使用每个调用的参数数量,而不是一段代码,你怎么可能正确地实现它?我需要在 VS2013 中做同样的事情,我完全迷失了。你能提供一些代码吗?谢谢。
  • @JoanComasFdz 我将我的实现放在了一个要点中:gist.github.com/OmerRaviv/fc3ce6fbd5b6af501f01 请注意,此代码在 VS2015 中无法正常工作,因为新的 Roslyn 语言服务不是 100% 向后兼容。在 VS2015 中,一种更可靠、更高效的方法是找到你想去的东西的 ISymbol,然后使用 ISymbol.Locations 属性找出它的源位置。
  • @OmerRaviv 感谢您提供代码要点。但是,sn-p 中的VisualStudioServices 是从哪里来的呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2017-03-09
  • 1970-01-01
相关资源
最近更新 更多