首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查微小的和胖的.NET方法头

检查微小的和胖的.NET方法头
EN

Stack Overflow用户
提问于 2015-07-03 11:18:52
回答 1查看 588关注 0票数 0

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

有一个dnlib.DotNet.Writer.MethodBody类指示微/胖方法头(请参阅IsTiny()IsFat())。但是,我不知道如何访问这个类。

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

代码语言:javascript
复制
    public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
    {

请注意,枚举所有方法并获取另一个MethodBody ( Emit命名空间中的方法)很容易:

代码语言:javascript
复制
        foreach (TypeDef type in module.GetTypes())
        {
            foreach (MethodDef method in type.Methods)
            {
                dnlib.DotNet.Emit.MethodBody body = method.MethodBody;
            }
        }
    }

不幸的是,这个类没有揭示任何有用的东西。我认为类似于以下伪码的东西应该有效:

代码语言:javascript
复制
    public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
    {
        foreach (TypeDef type in module.?)
        {
            foreach (? method in type.?)
            {
                dnlib.DotNet.Writer.MethodBody body = method.?;
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2015-07-05 19:53:44

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

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31205570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档