我试图弄清楚是否可以通过反射(或其他方式)“审核”某些代码以强制执行验证要求——例如检查代码是否创建任何线程(System.Threading.Thread)或使用其他 BCL。假设代码已经编译成 dll。谢谢!
5 回答
看看 FxCop。它可以加载已编译的二进制文件(dll 或 exe)并针对已编译的 IL 执行验证和合规性检查,而不管用于编写它的 .NET 语言如何。
您可以编写自己的规则——在这种情况下,您可以这样做以捕获“= new Thread()”等情况。
如果您精通 IL,则可以通过反思来做到这一点。
MethodBody mb = this.GetType().GetMethod( "Method", BindingFlags.Default ).GetMethodBody();
byte[] bytes = mb.GetILAsByteArray();
可能麻烦多于它的价值;生成的 IL 将需要被解析。
一个 IL 解析器(但有些过时): http: //www.codeproject.com/KB/cs/sdilreader.aspx,它将为您生成一个 OpCodes 列表(查找 OpCodes.Newobj 用于实例化线程)。
正如其他人所说,反射不会帮助你,因为它只描述了 tpyes 的元数据。
但是,Mono.Ceci l 项目是一种实际查看程序集中类型的 IL(中间语言)的运行时方式。虽然是 Mono 框架的产品,但它与 Microsoft CLR 兼容。
反射不允许检查成员的身体,只能检查他们的签名。换句话说,它不会告诉你任何关于特定方法或属性的作用,只是告诉你它的样子。
要做你想做的事,你必须使用类似的东西ildasm.exe
将编译的 .dll 或 .exe 转换为 IL,然后检查 IL,看看它是否在做任何你反对的事情。
反射将允许您通过MethodBase.GetMethodBody检查方法体,这为您提供了一个可供检查的MethodBody。
但是,在这个级别上,您正在处理字节数组中的原始 IL,您必须从头到尾分析它以找出对外部方法的调用以及它们的作用等。
所以它不会很漂亮或容易,但肯定是有可能的。