C# 分析CodeCompileUnit中使用的类型/类

C# 分析CodeCompileUnit中使用的类型/类,c#,razor,codedom,C#,Razor,Codedom,我正在使用如下内容构建Razor模板解析器: RazorEngineHost host = new RazorEngineHost(new CSharpRazorCodeLanguage()); RazorTemplateEngine engine = new RazorTemplateEngine(host); CodeDomProvider provider = new CSharpCodeProvider(); GeneratorResults razorTemplate = engin

我正在使用如下内容构建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);
@{ System.Threading.Tasks.Task.Run(() => while(true)); }
现在,出于安全原因,我想分析
razorTemplate.GeneratedCode
,以了解某些类的使用情况,例如编译以下内容时/之前:

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);
@{ System.Threading.Tasks.Task.Run(() => while(true)); }
我想检测
任务的使用情况,然后不编译它并引发安全异常。
由于这是Razor模板,因此以下内容应有效:

System.Threading.Tasks.Task.Run(()=>while(true))是邪恶的。渲染时间:@DateTime.Now

因此,我不能使用“简单文本搜索”来验证模板

我该怎么做

我已经通过调试器搜索了
razorTemplate
-对象,但没有在其中找到“任何方法”


注意:当您查看与使用代码的
任务相对应的语句时,可以在使用示例模板的方法
CompileAsync
中找到完整的代码(类似于
((CodeMemberMethod)razorTemplate)​.生成代码​.名称空间[0]​.类型[0]​.成员[1])​.语句[0]
),您将看到它是一个。这意味着CodeDOM对语句的结构一无所知,它只是一个字符串

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


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

这并非不可能,您可以使用反射来分析代码。然而,这是一个只开始,从未完成的项目。@HansPassant:我知道,它永远不会是“完美的”,但至少某种程度的安全性会很好(即检测
任务
线程
的任何使用)。你能给我一个起点吗?这是怎么做到的?我搜索了很多,只找到了“另一种方法”,但没有关于如何分析已经创建的“代码”的示例。在TypeRef表中,
存储了程序集中使用的所有类型
——这正是我需要的。我用
ILDASM
检查了它,但我没有找到任何示例或文档说明如何使用
Mono.Cecil
读取
TypeRef
表(仅
TypeDef
)。你知道这方面的例子吗?我在