我希望在一组已编译的 .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.Reflection
功能感兴趣的类型信息。
我现在需要找到该类的原始 .cs 源文件。虽然我有一个蛮力解决方案作为解决方法,但它的速度慢得让人无法接受。
我希望在大约 5 秒内完成整个过程。目前,反射提取部分需要不到 1 秒,“文件关联”需要几分钟。我不认为在 4 秒内扫描几个 MB 是不合理的。
不幸的是,有一些警告可以防止走捷径。
我不知道文件的名称,所以我需要
dir / s *.cs
每次运行来枚举所有潜在的源文件。类名并不总是与源文件匹配,它可以提示可能的位置,但不能保证工作。
在某些情况下,多个类在同一个文件中定义。
有 ~20k .cs 文件/63MB 的源代码。
我需要大约 10k 个类/它们的文件之间的关联。
我不希望使用其中声明的文件名/类来增量构建数据库,因为文件内容会发生变化,并且我将很难维护这个数据库等(尽管如果一切顺利,我可能不得不走这条路否则失败)。
这将在操作系统上运行,不会启用 Windows 搜索/索引,所以那里也没有乐趣。
我试过的:
使用 findstr.exe - 太慢了
创建一个 .net 应用程序,将所有文件加载到内存中。- 太慢找不到 *.cs / 加载所有文件,一旦文件在内存中就快速扫描文件。
从所有较小的文件创建一个大的源文件,加载它,扫描等 - 再一次,太慢了。构建文件需要几分钟,加载后很快。
读取 PDB 文件 - 我正在研究 PDB2XML.exe,虽然它确实输出文件名并且运行速度很快,但我看不到如何将类与文件名相关联。
那么,是否有人对 PDB2XML 有其他建议、魔法或一些经验?