Как декомпилировать указанный метод c, генерирующий тот же код при декомпиляции через DecompileTypeAsString - PullRequest
1 голос
/ 26 февраля 2020

NOOB с ILSPY

Я пытаюсь декомпилировать метод через ILSpy. Когда я использую следующее, я получаю повторно сгенерированный код, который очень близок к тому, что было напечатано в оригинале C#

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

Сгенерированный код выглядит примерно так:

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

Принимая во внимание, что когда я использую следующий фрагмент,

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, путем декомпиляции только одна функция?

1 Ответ

0 голосов
/ 27 февраля 2020

Я подал ошибку в ILSpy, и она была помечена как улучшение. Так что, думаю, сейчас это невозможно.

Я пока go уродливый маршрут регулярных выражений и проверю улучшение в более поздних версиях.

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

...