gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:09:19 26 4
gpt4 key购买 nike

我要在一组已编译的 .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 的一些经验?

最佳答案

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

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

关于c# - 在c#中查找已编译类的源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13038249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com