1

我试图弄清楚是否可以通过反射(或其他方式)“审核”某些代码以强制执行验证要求——例如检查代码是否创建任何线程(System.Threading.Thread)或使用其他 BCL。假设代码已经编译成 dll。谢谢!

4

5 回答 5

2

看看 FxCop。它可以加载已编译的二进制文件(dll 或 exe)并针对已编译的 IL 执行验证和合规性检查,而不管用于编写它的 .NET 语言如何。

您可以编写自己的规则——在这种情况下,您可以这样做以捕获“= new Thread()”等情况。

于 2011-03-04T04:59:57.830 回答
2

如果您精通 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 用于实例化线程)。

于 2011-03-04T05:02:58.330 回答
1

正如其他人所说,反射不会帮助你,因为它只描述了 tpyes 的元数据。

但是,Mono.Ceci l 项目是一种实际查看程序集中类型的 IL(中间语言)的运行时方式。虽然是 Mono 框架的产品,但它与 Microsoft CLR 兼容。

于 2011-03-04T05:01:02.310 回答
0

反射不允许检查成员的身体,只能检查他们的签名。换句话说,它不会告诉你任何关于特定方法或属性的作用,只是告诉你它的样子。

要做你想做的事,你必须使用类似的东西ildasm.exe将编译的 .dll 或 .exe 转换为 IL,然后检查 IL,看看它是否在做任何你反对的事情。

于 2011-03-04T04:58:23.053 回答
0

反射将允许您通过MethodBase.GetMethodBody检查方法体,这为您提供了一个可供检查的MethodBody

但是,在这个级别上,您正在处理字节数组中的原始 IL,您必须从头到尾分析它以找出对外部方法的调用以及它们的作用等。

所以它不会很漂亮或容易,但肯定是有可能的。

于 2011-03-04T05:04:52.510 回答