从.NET代码中提取数据

时间:2017-08-31 13:03:22

标签: c# reflection

TLDR;

我需要在.NET代码中提取对Microsoft.Extensions.Localization.IStringLocalizer的索引运算符的所有调用的参数的字符串值。实际上我还需要封闭类的全名。

警告:上面还包括我的ASP.NET Core MVC剃刀视图。

基本上我的需求非常类似于"查找所有引用" Visual Studio中的功能。

为什么和其他想法

原因是我们在不需要实际创建资源的情况下使用IStringLocalizer来理解开发流程。此外,我们使用Damien Bods AspNetCoreLocalization将资源文件的使用替换为数据库存储。

这使我们能够让业务专家完成所有翻译(1)而无需访问Web服务器的文件系统,(2)从我们提供的良好界面,以及(3)独立于开发周期。但是,为了让业务专家了解哪些文本存在 - 因此需要翻译 -  我们需要提取IStringLocalizer(和IViewStringLocalizor)索引运算符的所有用法。

基于this article,我部分设法从已加载的程序集中提取信息。

我的主要问题是:

  • 我的代码基于SDILReader,它已经很老了,不再维护了,显然有很多问题(使用较新的CIL?)
  • 如何在运行时编译JIT的razor视图中提取用法?
  • 我更喜欢在部署时最迟提取数据,但最好是在提交或CI构建时
  • Roslyn能帮助满足我的需求吗?
  • 我是否忽略了任何工具或替代方法?
  • 我更喜欢不易受未来.NET框架/运行时版本或新C#功能攻击的解决方案

欢迎任何想法或指示:-) 感谢

1 个答案:

答案 0 :(得分:1)

按照你的要点:

  1. 我使用Mono Reflection分析了IL代码它说它适用于.NET 4并且似乎有所维护(最新版本是2016年)
  2. Razor视图被编译为C#类,您可以使用ASP.NET Compiler在构建时执行此操作(这对于避免缓慢的首次加载时间也很有用)编译页面后,您可以分析生成的类
  3. 在提交时提取可能需要很长时间(构建视图需要一段时间,如果它们是任何)我会在CI服务器上执行。
  4. 对于C#Roslyn绝对是一个选择,但我不认为它可以帮助你剃刀视图,但我不是100%肯定这一点。
  5. 我不知道有哪些工具可以帮助您完成此任务,但我不确定
  6. 如果IL发生变化,分析IL很容易中断,但对于C#代码分析器来说也是如此,并且IL的变化比C#更少。
  7. 如果您需要代码的符号执行方面的帮助,我可以发布一个简单的符号执行方法,可以跟踪局部变量或执行堆栈中的常量。