繁体   English   中英

反编译涉及匿名类型和lambda表达式的代码

[英]Decompiling code involving anonymous types and lambda expressions

由于加密的编译器代码,我反编译为一个小的更改的.NET项目不再编译。 这些代码部分可能是由于涉及了lambda表达式和匿名类型。

我试图了解相应的代码片段,以便将它们更改回可以正常工作的/成功编译的语法,但没有成功。

public static void DoEvents()
{
  Dispatcher dispatcher = System.Windows.Application.Current.Dispatcher;
  Action action;      
  if (common._Closure\u0024__.\u0024I13\u002D0 != null)
  {        
    action = common._Closure\u0024__.\u0024I13\u002D0;
  }
  else
  {       
    common._Closure\u0024__.\u0024I13\u002D0 = action 
    = (Action)(() => {  });
}
dispatcher.Invoke(DispatcherPriority.Background, (Delegate)action);
}

我不知道在使用诸如dotPeek之类的工具时,代码反编译的“神秘”结果是否可以避免,如果不能,如何修复它使其可再次编译。

在我看来,您正在尝试反编译System.Windows.Forms.dll中的public static void DoEvents()方法。 无需这样做,您只需浏览.NET Framework源代码即可。

https://referencesource.microsoft.com/#System.Windows.Forms/

您的方法在Application.cs中

我以前没有像这样处理过代码,但是看起来lambda表达式本身已经正确地反编译了,未反编译的代码是一种优化,以避免每次调用代码时创建新的Action。 (由于给定的lambda没有捕获的变量,因此可以将其视为单例。)

所以我认为有效的起始代码将是:

public static void DoEvents()
{
  Dispatcher dispatcher = System.Windows.Application.Current.Dispatcher;
  dispatcher.Invoke(DispatcherPriority.Background, () => {  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM