Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查tiny与fat.NET方法头_C#_.net_Methods_Dnlib - Fatal编程技术网

C# 检查tiny与fat.NET方法头

C# 检查tiny与fat.NET方法头,c#,.net,methods,dnlib,C#,.net,Methods,Dnlib,我需要枚举.NET模块中的所有方法,并检查它们的头是否很小或很胖。我决定使用功能强大的.NET模块处理库 有一个dnlib.DotNet.Writer.MethodBody类,它指示微小的/fat方法头(请参见istini()和IsFat())。但是,我不知道如何访问这个类 该类位于Writer命名空间中-让我们使用Writer侦听器: public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)

我需要枚举.NET模块中的所有方法,并检查它们的头是否很小或很胖。我决定使用功能强大的.NET模块处理库

有一个
dnlib.DotNet.Writer.MethodBody
类,它指示微小的/fat方法头(请参见
istini()
IsFat()
)。但是,我不知道如何访问这个类

该类位于Writer命名空间中-让我们使用Writer侦听器:

    public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
    {
请注意,枚举所有方法并获取另一个
MethodBody
,即
Emit
名称空间中的方法很容易:

        foreach (TypeDef type in module.GetTypes())
        {
            foreach (MethodDef method in type.Methods)
            {
                dnlib.DotNet.Emit.MethodBody body = method.MethodBody;
            }
        }
    }
不幸的是,这个类没有显示任何有用的内容。我相信类似于以下伪代码的东西应该可以工作:

    public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
    {
        foreach (TypeDef type in module.?)
        {
            foreach (? method in type.?)
            {
                dnlib.DotNet.Writer.MethodBody body = method.?;
            }
        }
    }

在摆弄了dnlib之后,我发现它们并没有真正公开方法头、标志或原始方法字节。使用他们自己的代码,我自己阅读了标题:

class MainClass
{
    public static void TestMethod() {
        return;
    }

    public static void Main (string[] args)
    {
        // Load mscorlib.dll
        string filename = typeof(void).Module.FullyQualifiedName;
        ModuleDefMD mod = ModuleDefMD.Load(Assembly.GetExecutingAssembly().Location);

        foreach (TypeDef type in mod.GetTypes()) {
            Console.WriteLine("Type: {0}", type.FullName);

            foreach (var method in type.Methods) {
                using (var reader =  mod.MetaData.PEImage.CreateFullStream()) {
                    reader.Position = (long)mod.MetaData.PEImage.ToFileOffset(method.RVA);
                    var flags = reader.ReadByte ();
                    Console.WriteLine (" Method: {0}, Tiny: {1}", method.Name, (flags & 3) == 2);
                }
            }
        }
        Console.WriteLine();
    }
}

我真的很好奇你为什么需要这个?@Andrey这是一件很不寻常的事情:作为高级模糊处理程序的一部分,我需要重写方法中的指令,以便它们只在自定义的.NET运行时运行。因为我已经习惯了dnlib,而且因为dnlib不知道我的指令,而且因为将我自己的指令实现到dnlib会太复杂,所以我决定在二进制级别执行此操作。要获取方法中第一条指令的偏移量,必须知道方法体标头的长度。由于长度不可用,我需要知道标题的类型。@Andrey您是否删除了答案?我相信它可能对某些人有用…是的,我删除了它,因为它是错误的,因为内置.net反射只能返回方法体,无法从中获取标题。要回答您的问题,您需要修改dnlib,我找不到任何有意义的文档如何获取方法标题。但我在资料中看到了,所以它就在某个地方。