在c#中查找已编译类的源文件

我希望在一组编译的.net程序集中找到特定类的相关源文件。

例如

MyAsm.Namespace.Foo -> C:\Source\foo.cs MyAsm.Namespace.Bar -> C:\Source\Code\MoreCode\Common.cs MyAsm.Namespace2.Bar -> C:\Source\Code\MoreCode\Common.cs ... 

我有使用标准System.Reflectionfunction的程序集reflection/提取我感兴趣的类型信息。

我现在需要找到该类的原始.cs源文件。 虽然我有一个powershell解决方案作为一种解决方法,但它的速度令人无法接受。

我希望在5秒内完成整个过程。 目前,reflection提取部分花费不到1秒,“文件关联”需要几分钟。 我不认为在4秒内扫描几个MB是不合理的。

不幸的是,有一些警告,可以防止捷径。

  • 我不知道文件的名称,所以每次运行我都需要做一个dir / s *.cs来枚举所有潜在的源文件。

  • 类名称并不总是与源文件匹配,它可以提示可能的位置,但不能保证其工作。

  • 在某些情况下,在同一文件中定义了多个类。

  • 有~20k .cs文件/ 63MB源。

  • 我需要~10k类/他们的文件之间的关联。

  • 我不想逐步构建一个带有文件名/类的DB,因为文件内容会发生变化,我将无法维护这个DB等(尽管我可能不得不沿着这条路走下去)否则失败)。

  • 操作系统将运行,不会启用Windows搜索/索引,所以也没有喜悦。

我尝试过的:

  • 使用findstr.exe – 太慢了

  • 创建.net应用程序,将所有文件加载到内存中。 – 找到* .cs /加载所有文件的速度太慢,一旦文件在内存中就会快速扫描。

  • 从所有较小的文件创建一个大型源文件,加载它,扫描等 – 再次,太慢了。 一旦加载,需要几分钟来构建文件。

  • 阅读PDB文件 – 我正在调查PDB2XML.exe,虽然它确实输出文件名,并且运行速度很快,但我无法看到如何将类与文件名相关联。

那么,有没有人有PDB2XML的替代建议,魔术或一些经验?

如果文件在磁盘上,使用PDB是最好的选择IMHO。 文件名(由ISymbolDocument.URL表示)与序列点相关。 序列点与方法(包括属性get / set)有关,而不是类。 当然,.NET类源可以存储在多个文件中。 因此,您必须浏览所有类型的成员(例如使用reflection)来确定所有相应的文件。

这并不能完全解决您所面临的问题,因为您希望获得任意类的文件路径,但这对于我的使用来说很容易,只是从源位置获取指向某个文件的指针。 我在unit testing中使用它,因此性能不是非常重要。

 var x = new StackTrace(true); var file = x.GetFrame(0).GetFileName(); 

我不知道.NET中的文件名和程序集名称之间有任何关系,实际上可能在一个文件中定义了多个程序集,所以我没有看到如何在不实际查看每个源代码的情况下执行此操作文件并搜索类定义或维护运行索引。