57621


VisualStudioでは「すべての参照を検索」を使って、変数やメソッドが参照している部分を検索できますが、C#プログラムを作成して参照情報（行番号、ファイル名、クラス名等）を取得することはできるのでしょうか。

ターゲットフレームワークは4.0以降です。


CC BY-SA 4.0
2019-08-25T02:19:57.457
57582
2019-08-27T13:20:24.043
30138
question
c# visual-studio
「すべての参照を検索」で出力される参照情報を取得したい


コメントで紹介した.NET Compiler Platform SDKの解説記事に「すべての参照を検索」について言及されていたので引用します。  
具体的に使うのが何かは書いてありませんが、「Workspaces APIs」というもので出来るようです。

[.NET Compiler Platform ("Roslyn") Overview](https://dotnet.github.io/dotnet-
web/docs/advanced/roslyn/roslyn-overview.html)

> For decades, this world view has served us well, but it is no longer
> sufficient. Increasingly we rely on integrated development environment (IDE)
> features such as IntelliSense, refactoring, intelligent rename, **"Find all
> references,"** and "Go to definition" to increase our productivity. We rely
> on code analysis tools to improve our code quality and code generators to
> aid in application construction. As these tools get smarter, they need
> access to more and more of the deep code knowledge that only compilers
> possess. This is the core mission of the .NET Compiler Platform ("Roslyn"):
> opening up the black boxes and allowing tools and end users to share in the
> wealth of information compilers have about our code. Instead of being opaque
> source-code-in and object-code-out translators, through the .NET Compiler
> Platform ("Roslyn"), compilers become platforms—APIs that you can use for
> code related tasks in your tools and applications.
>
> 何十年もの間、この世界観は私たちに役立ってきましたが、もはや十分ではありません。IntelliSense、リファクタリング、インテリジェントな名前変更、
> **「すべての参照を検索」**
> 、「定義に移動」などの統合開発環境（IDE）機能にますます依存して、生産性を向上させています。コードの品質を向上させるコード分析ツールと、アプリケーションの構築を支援するコードジェネレーターに依存しています。これらのツールがよりスマートになると、コンパイラーだけが所有するコードに関する深い知識にますますアクセスする必要があります。これが.NETコンパイラプラットフォーム（「Roslyn」）の中心的な使命です。ブラックボックスを開き、ツールとエンドユーザーがコードについてコンパイラが持っている豊富な情報を共有できるようにします。.NET
> Compiler Platform（「Roslyn」）を介した、不透明なソースコードインおよびオブジェクトコードアウトのトランスレーターである代わりに、

[API Layers](https://dotnet.github.io/dotnet-web/docs/advanced/roslyn/roslyn-
overview.html#api-layers)

> **Workspaces APIs**
>
> In addition, the Workspaces layer surfaces a set of commonly used APIs used
> when implementing code analysis and refactoring tools that function within a
> host environment like the Visual Studio IDE, such as the **Find All
> References** , Formatting, and Code Generation APIs.
>
> さらに、Workspacesレイヤーは、 **すべての参照の検索** 、書式設定、コード生成APIなど、Visual Studio
> IDEなどのホスト環境内で機能するコード分析およびリファクタリングツールを実装するときに使用される一般的に使用されるAPIのセットを表示します。

**少し古いですが、英語版StackOverflowでその方法についての記事がありました。**  
[Finding all references to a method with
Roslyn](https://stackoverflow.com/q/31861762/9014308)  
解決マークの付いた回答の冒頭  
(ちなみに回答内の SymbolFinder と FindAllReferences のリンクは無くなっていて、今は[SymbolFinder
Class](https://docs.microsoft.com/en-
us/dotnet/api/microsoft.codeanalysis.findsymbols.symbolfinder?view=roslyn-
dotnet) とその中の似た名前の各メソッドが使えるようになっているのでしょう)

> You're probably looking for the SymbolFinder class and specifically the
> FindAllReferences method.
>
> It sounds like you're having some trouble getting familiar with Roslyn. I've
> got a series of blog posts to help people get introduced to Roslyn called
> Learn Roslyn Now.
>
> As @SLaks mentions you're going to need access to the semantic model which I
> cover in Part 7: Introduction to the Semantic Model
>
> おそらくSymbolFinderクラス、特にFindAllReferencesメソッドを探しているでしょう。
>
> Roslynに慣れるのに苦労しているようです。Learn Roslyn NowというRoslynを紹介するのに役立つ一連のブログ投稿があります。
>
> @SLaksが言及しているように、第7部で説明するセマンティックモデルにアクセスする必要があります：セマンティックモデルの概要

* * *

その他

コメントで紹介したページの日本語版がこちら  
[.NET Compiler Platform SDK](https://docs.microsoft.com/ja-
jp/dotnet/csharp/roslyn-sdk/)

それから、英語版StackOverflowで類似の質問がありました。  
[Find All References list and export
it](https://stackoverflow.com/q/11341978/9014308)

> I need to get a list of the references to a specific class (usually
> inherits) and be able to manage it, I mean, export or simply copy all.  
>  The VS Find all References is not usefull as I can not copy the list to
> elsewhere.  
>  Do someone know a trick/tool for that.
>
> 特定のクラス（通常は継承）への参照のリストを取得し、それを管理できる、つまりすべてをエクスポートまたは単純にコピーできるようにする必要があります。  
>  リストを他の場所にコピーできないため、VS Find all Referencesは役に立ちません。  
>  誰かがそのためのトリック/ツールを知っていますか？

解決マーク付き

> Use Resharper. The best tool for .Net buddies. I am not sure about the
> physical file copy but you can generate a list of the referenced dll.
>
> Resharperを使用します。.Netの仲間に最適なツール。物理ファイルのコピーについてはわかりませんが、参照されたdllのリストを生成できます。

別の回答(手作業)

> Actually, you can copy Find All References results from VS. Make sure Find
> All References window has focus, do Select All (Ctrl-A) and right click,
> then select Copy from context menu. You get a tab delimited list. It works
> at least in VS2017 and VS2019.
>
>
> 実際には、VSからすべての参照の検索結果をコピーできます。[すべての参照の検索]ウィンドウにフォーカスがあることを確認し、[すべて選択]（Ctrl-A）を押して右クリックし、コンテキストメニューから[コピー]を選択します。タブ区切りリストを取得します。少なくともVS2017およびVS2019で機能します。

上記手作業の関連記事がこちら  
[Unable to copy Find Symbol
Results](https://developercommunity.visualstudio.com/content/problem/60884/unable-
to-copy-find-symbol-results.html)

解決回答に出ていたReSharperを含む多くのツールの紹介記事  
[Using the Visual Studio Code Refactoring
Tools](https://www.codeguru.com/csharp/.net/net_debugging/debugging/using-the-
visual-studio-code-refactoring-tools.html)  
[Doing Visual Studio and .NET Code Documentation
Right](https://visualstudiomagazine.com/Articles/2017/02/21/VS-dotNET-Code-
Documentation-Tools-Roundup.aspx)  
[Code Analysis, Profiling and Refactoring Tools for Visual Studio
2017](https://visualstudiomagazine.com/Articles/2017/10/01/Code-Analysis.aspx)  
[The Ultimate List of C# Tools: IDEs, Profilers, Automation Tools, and
More](https://stackify.com/best-csharp-tools/)


CC BY-SA 4.0
2019-08-27T00:12:34.277
57621
2019-08-27T13:20:24.043
2019-08-27T13:20:24.043
26370
26370
57582
answer