我需要枚举.NET模块中的所有方法,并检查它们是否有微小的或胖的标头。我决定使用功能强大的德尼布 .NET模块处理库。
有一个dnlib.DotNet.Writer.MethodBody类指示微/胖方法头(请参阅IsTiny()和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.?;
}
}
}发布于 2015-07-05 19:53:44
在处理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();
}
}https://stackoverflow.com/questions/31205570
复制相似问题