博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ilspy 点击根节点后进行解析的方法
阅读量:5172 次
发布时间:2019-06-13

本文共 3035 字,大约阅读时间需要 10 分钟。

 

主要执行对根节点反编译的功能为以下函数:

函数中主要的代码:

1:
2:                  // don't automatically load additional assemblies when an assembly node is selected in the tree view
3:                  using (options.FullDecompilation ? null : LoadedAssembly.DisableAssemblyLoad()) {
4:                      AstBuilder codeDomBuilder = CreateAstBuilder(options, currentModule: assembly.AssemblyDefinition.MainModule);
5:                      codeDomBuilder.AddAssembly(assembly.AssemblyDefinition, onlyAssemblyLevel: !options.FullDecompilation);
6:                      codeDomBuilder.RunTransformations(transformAbortCondition);
7:                      codeDomBuilder.GenerateCode(output);
8:                  }
5行实现添加程序集,
6行实现什么功能?
分析如下:
 
 
1:  public void RunTransformations(Predicate
transformAbortCondition)
2:          {
3:              TransformationPipeline.RunTransformationsUntil(astCompileUnit, transformAbortCondition, context);
4:              transformationsHaveRun = true;
5:          }
 

传递的参数是一个“转换失败时中止的条件”,2行字面分析要执行转换单元,3行标识转换工作已经运行

可以先看以下链接的关于反编译管道详细介绍,

博客链接

 

继续分析TransformationPipeline这个类:

1:  public static class TransformationPipeline
2:      {
3:          public static IAstTransform[] CreatePipeline(DecompilerContext context)
4:          {
5:              return new IAstTransform[] {
6:                  new PushNegation(),
7:                  new DelegateConstruction(context),
8:                  new PatternStatementTransform(context),
9:                  new ReplaceMethodCallsWithOperators(context),
10:                  new IntroduceUnsafeModifier(),
11:                  new AddCheckedBlocks(),
12:                  new DeclareVariables(context), // should run after most transforms that modify statements
13:                  new ConvertConstructorCallIntoInitializer(), // must run after DeclareVariables
14:                  new DecimalConstantTransform(),
15:                  new IntroduceUsingDeclarations(context),
16:                  new IntroduceExtensionMethods(context), // must run after IntroduceUsingDeclarations
17:                  new IntroduceQueryExpressions(context), // must run after IntroduceExtensionMethods
18:                  new CombineQueryExpressions(context),
19:                  new FlattenSwitchBlocks(),
20:              };
21:          }
22:
23:          public static void RunTransformationsUntil(AstNode node, Predicate
abortCondition, DecompilerContext context)
24:          {
25:              if (node == null)
26:                  return;
27:
28:              foreach (var transform in CreatePipeline(context)) {
29:                  context.CancellationToken.ThrowIfCancellationRequested();
30:                  if (abortCondition != null && abortCondition(transform))
31:                      return;
32:                  transform.Run(node);
33:              }
34:          }
35:      }
结合博客的解释,可以得出,以上第六行的代码的功能便是对AstNode (Abstract Source Tree Node)进行转换管道的处理,最终处理为便于阅读的C#代码。
 

转载于:https://www.cnblogs.com/symphony2010/archive/2012/03/25/2416813.html

你可能感兴趣的文章
Confluence 6 升级以后
查看>>
用JS实现版面拖拽效果
查看>>
二丶CSS
查看>>
《avascript 高级程序设计(第三版)》 ---第二章 在HTML中使用Javascript
查看>>
JS一些概念知识及参考链接
查看>>
TCP/IP协议原理与应用笔记24:网际协议(IP)之 IP协议的简介
查看>>
SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
查看>>
游戏中的心理学(一):认知失调有前提条件
查看>>
WHAT I READ FOR DEEP-LEARNING
查看>>
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
读《构建之法-软件工程》第四章有感
查看>>
使用 Printf via SWO/SWV 输出调试信息
查看>>
.net 分布式架构之分布式锁实现(转)
查看>>
Problem E: Automatic Editing
查看>>
SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
查看>>