Проверка крошечного и толстого заголовка метода.NET

Мне нужно перечислить все методы в модуле.NET и проверить, имеют ли они крошечный или толстый заголовок. Я решил использовать мощную библиотеку обработки модулей dnlib.NET.

E сть dnlib.DotNet.Writer.MethodBody класс, который указывает заголовок метода tiny / fat (см. IsTiny() а также IsFat()). Тем не менее, я понятия не имею, как получить доступ к этому классу.

Класс находится в пространстве имен Writer - давайте используем Writer Listener:

    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.?;
            }
        }
    }

1 ответ

После игры с 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();
    }
}
Другие вопросы по тегам