【问题标题】:How to decompile a specific method generating the same code when decompiled via DecompileTypeAsString通过 DecompileTypeAsString 反编译时如何反编译生成相同代码的特定方法
【发布时间】:2020-02-26 00:29:39
【问题描述】:

使用 ILSPY 的 NOOB

我正在尝试通过 ILSpy 反编译一个方法。当我使用以下代码时,我重新生成的代码与原始 C# 中键入的代码非常接近

decompiler.DecompileTypeAsString(new FullTypeName($@"{MyFullTypeName}"));

生成的代码如下所示。

public async Task<IReadOnlyList> FuncName(parameterList)
{
//Actual code body
}

而当我使用以下 sn-p 时,

string functionName = "ReflectionNamed__5";
var name = new FullTypeName(functionName);
ITypeDefinition typeInfo = decompiler.TypeSystem.MainModule.Compilation.FindType(name).GetDefinition();
if (typeInfo.Methods.First().HasBody)
{
    var tokenOfFirstMethod = typeInfo.Methods.First().MetadataToken;
    var methodCodeString = decompiler.DecompileAsString(tokenOfFirstMethod);
    Console.WriteLine(methodCodeString);
}

生成的代码如下:

//Using statements

    private void MoveNext()
    {
        int num = <>1__state;
        IReadOnlyList<string> result;
        try
        {
                if (num != 0)
                {
                        //Abstraction of a using statement
                }
                try
                {
                        TaskAwaiter<IReadOnlyList<string>> awaiter;
                        if (num != 0)
                        {
                                //Somewhat resembles the actual code
                        }
                        else
                        {
                                awaiter = <>u__1;
                                <>u__1 = default(TaskAwaiter<IReadOnlyList<string>>);
                                num = (<>1__state = -1);
                        }
                        result = awaiter.GetResult();
                }
                finally
                {
                        if (num < 0 && <oLogger>5__2 != null)
                        {
                                <oLogger>5__2.Dispose();
                        }
                }
        }
        catch (Exception exception)
        {
                <>1__state = -2;
                <>t__builder.SetException(exception);
                return;
        }
        <>1__state = -2;
        <>t__builder.SetResult(result);
    }

有没有办法通过只反编译一个函数来生成 DecompileTypeAsString 生成的代码?

【问题讨论】:

  • Telerik JustCompile 使用此代码可能会更好。
  • 一个是给你编译器生成的IAsyncStatemachine,另一个是给你一个更有代表性的带有异步方法的原始代码版本。
  • @MichaelRandall tr​​ue,我要解决的方案是,给定反射名称,生成代码的代表版本。如果我反编译一个方法,编译器生成的版本就不是真正的人类可读的。我正在考虑的另一种方法是从反射名称生成方法签名,然后正则表达式从代表版本中查找代码。绝对是一种丑陋的方法,如果有其他选择,欢迎提出建议。

标签: c# ilspy


【解决方案1】:

我在 ILSpy 上提交了一个问题,它已被标记为增强。所以估计目前是不可能的。

我现在将采用丑陋的正则表达式路线,并在以后的版本中重新检查增强功能。

https://github.com/icsharpcode/ILSpy/issues/1935

【讨论】:

  • 什么是“丑陋的正则表达式路由”?
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多