如果您尝试使用反编译器,例如:jetbrains dotpeek,redgate反射器,telerik justdecompile,等等。有时如果您需要复制代码或只是为了理解,那么这是不可能的,因为它显示了类似的东西:
[CompilerGenerated]
private sealed class Class15
{
// Fields
public Class11.Class12 CS$<>8__locals25;
public string endName;
// Methods
public Class15();
public bool <Show>b__11(object intelliListItem_0);
}
我没有采取混淆,这是随时发生的,我是didsome测试(我自己的代码),并使用lambdas和迭代器发生。我不确定,是否有人可以提供有关何时以及为何的更多信息..?
因此,通过标准的Visual Studio不编译$和&lt;&gt; c#中的关键字(如上面的代码)......
有一种方法可以自动翻译或转换这个反编译代码吗?
答案 0 :(得分:4)
Lambdas是一种封闭形式,它是一种豪华的方式,它可以说它是一个代码单元,你可以传递它,就像它是一个对象(但可以访问它的原始上下文)。当编译器找到lambda时,它会生成一个新类型(Type为类或结构),它封装了lambda在其原始上下文中访问的代码和任何字段。
这里的问题是,如何生成永远不会与用户编写的代码冲突的代码?
编译器的答案是生成在您使用的语言中非法的代码,但在IL中是合法的。 IL是&#34;中级语言&#34;它是Common Language Runtime使用的母语。在CLR(C#,vb.net,F#)上运行的任何语言都会编译成IL。这就是你如何在C#代码中使用VB.Net程序集等。
因此,这就是反编译器生成您看到的可怕代码的原因。迭代器遵循与需要生成类型的许多其他语言功能完全相同的模型。
有一个有趣的副作用。 Lambda可以在其原始上下文中捕获变量:
public void TestCapture()
{
StringBuilder b = new StringBuilder();
Action l = () => b.Append("Kitties!");
}
所以通过捕获我的意思是这里的变量b包含在定义闭包的包中。
编译器尝试高效并创建尽可能少的类型,因此您最终可以得到一个生成的类,该类支持在特定类中找到的所有lambda,包括所有捕获的变量的字段。这样,如果你不小心,你可能会意外地捕获你希望释放的东西,导致跟踪内存泄漏非常棘手。
答案 1 :(得分:0)
是否有更改目标框架的选项?...我知道有些反编译器他们默认使用最低级别的框架(C#1.0)