【发布时间】: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 true,我要解决的方案是,给定反射名称,生成代码的代表版本。如果我反编译一个方法,编译器生成的版本就不是真正的人类可读的。我正在考虑的另一种方法是从反射名称生成方法签名,然后正则表达式从代表版本中查找代码。绝对是一种丑陋的方法,如果有其他选择,欢迎提出建议。