我正在寻找一组已编译的 .net 程序集中特定类的关联源文件。
e.g.
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
每次运行时,都会枚举所有潜在的源文件。
类名并不总是与源文件匹配,它可以hint在一个可能的位置,但不能保证它可以工作。
在某些情况下,在同一个文件中定义多个类。
有大约 20k .cs 文件/63MB 源代码。
我需要约 10k 个类/它们的文件之间的关联。
我不想增量地构建一个带有其中声明的文件名/类的数据库,因为文件内容会改变,而且我会在维护这个数据库等方面遇到麻烦(尽管如果一切都好的话我可能不得不走这条路)否则失败)。
它将运行的操作系统不会启用 Windows 搜索/索引,因此也没有什么乐趣。
我尝试过的:
使用 findstr.exe - 太慢
创建一个 .net 应用程序,将所有文件加载到内存中。 - 查找 *.cs/加载所有文件太慢
文件,一旦文件进入内存即可快速扫描文件。
从所有较小的文件创建一个大的源文件,加载它,扫描等等 - 再次太慢了。构建文件只需几分钟,加载后速度很快。
读取 PDB 文件 - 我正在研究 PDB2XML.exe,虽然它确实输出文件名并且运行速度很快,但我看不到如何将类与文件名关联起来。
那么,是否有人对 PDB2XML 有替代建议、魔法或一些经验?
这并不能完全解决您面临的问题,因为您想要获取任意类的文件路径,但这对我来说很容易使用,它只是从源位置获取指向某个文件的指针。我在单元测试中使用它,因此性能并不是非常重要。
var x = new StackTrace(true);
var file = x.GetFrame(0).GetFileName();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)