C#反射和审计类型

时间:2011-03-04 04:51:43

标签: c# reflection auditing

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

5 个答案:

答案 0 :(得分:2)

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

您可以编写自己的规则 - 在这种情况下您可以执行以捕获“= new Thread()”等情况。

答案 1 :(得分: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将为您生成一个OpCode列表(查找OpCodes.Newobj以实例化一个Thread)。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

反射不允许检查成员的正文,只检查他们的签名。换句话说,它不会告诉你关于做什么的特定方法或属性的任何内容,只是它看起来像什么。

要做你想要的事情,你必须使用类似ildasm.exe之类的东西将已编译的.dll或.exe转换为IL,然后检查IL并查看它是否正在执行任何操作对象

答案 4 :(得分:0)

反射将允许您通过MethodBase.GetMethodBody检查方法体,从而为您提供MethodBody检查。

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

所以它不会很简单,但肯定是可能的。