我正在使用以下内容构建Razor模板解析器:
RazorEngineHost host = new RazorEngineHost(new CSharpRazorCodeLanguage());
RazorTemplateEngine engine = new RazorTemplateEngine(host);
CodeDomProvider provider = new CSharpCodeProvider();
GeneratorResults razorTemplate = engine.GenerateCode(new StringReader(template));
var cParams = new CompilerParameters();
// set params....
var result = provider.CompileAssemblyFromDom(cParams, razorTemplate.GeneratedCode);
现在我想分析razorTemplate.GeneratedCode
出于安全原因使用某些类,例如在编译以下内容之前/之前:
@{ System.Threading.Tasks.Task.Run(() => while(true)); }
我想检测Task
的用法,然后不编译它并抛出一个安全例外
因为这是Razor-templates,所以以下内容应该是有效的:
< i> System.Threading.Tasks.Task.Run(()=> while(true))< / i>是邪恶的。渲染时间:@ DateTime.Now
所以我不能使用"简单的文本搜索"验证模板。
我该怎么做?
我已经通过调试器搜索了razorTemplate
- 对象,但我没有找到"任何方法"在那里...
P.S。:方法CompileAsync
中可以找到完整的代码HERE。
答案 0 :(得分:2)
使用您的示例模板,当您查看与Task
对应的语句时 - 使用代码(类似((CodeMemberMethod)razorTemplate.GeneratedCode.Namespaces[0].Types[0].Members[1]).Statements[0]
),您将看到它&# 39; sa CodeSnippetStatement
。这意味着CodeDOM对该语句的结构一无所知,它只是一个字符串。
因此,如果您不愿意尝试自己解析代码(可能使用现有的编译器,如Roslyn),则无法从CodeDOM获取所需的信息。
另一种选择是使用已编译的程序集。在其中,在TypeRef
表中,存储了程序集中使用的所有类型。此表无法通过正常反射访问,但像Mono Cecil这样的元数据阅读器可以为您阅读。