为使用的类型/类分析CodeCompileUnit

时间:2014-10-25 13:06:41

标签: c# razor codedom

我正在使用以下内容构建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

1 个答案:

答案 0 :(得分:2)

使用您的示例模板,当您查看与Task对应的语句时 - 使用代码(类似((CodeMemberMethod)razorTemplate​.GeneratedCode​.Namespaces[0]​.Types[0]​.Members[1])​.Statements[0]),您将看到它&# 39; sa CodeSnippetStatement。这意味着CodeDOM对该语句的结构一无所知,它只是一个字符串。

因此,如果您不愿意尝试自己解析代码(可能使用现有的编译器,如Roslyn),则无法从CodeDOM获取所需的信息。

另一种选择是使用已编译的程序集。在其中,在TypeRef表中,存储了程序集中使用的所有类型。此表无法通过正常反射访问,但像Mono Cecil这样的元数据阅读器可以为您阅读。