前一篇中,只是对单一文件保存,进行了改进。

但在反编译时,还要一个一个的处理。

面对海量的代码,更需要一个能将所有的保存的工具。磨刀不误砍柴工,再改进一下工具。

首先找到在:

ILSpy\Languages\CSharpLanguage.cs

中,存在一段被注掉的代码:

// TODO implement extension point// var decompiler = Baml.BamlResourceEntryNode.CreateBamlDecompilerInAppDomain(ref bamlDecompilerAppDomain, assembly.FileName);/*string xaml = null;try{xaml = decompiler.DecompileBaml(ms, assembly.FileName, new ConnectMethodDecompiler(assembly), new AssemblyResolver(assembly));}catch (System.Xaml.XamlXmlWriterException) { } // ignore XAML writer exceptionsif (xaml != null){File.WriteAllText(Path.Combine(options.SaveAsProjectDirectory, Path.ChangeExtension(fileName, ".xaml")), xaml);yield return Tuple.Create("Page", Path.ChangeExtension(fileName, ".xaml"));continue;}

但是,根据目前对ILSpy 了解,这段代码是用不了的。

可能当时写这段代码的编程人员,还是基于相对旧的ILSpy 的框架来思考的,当时可能ILSpy还没有使用MEF框架。

(目前来讲,是在解决公司交给的具体问题,不是来研究细节的,Managed Extensibility Framework,还没仔细看。

所以,如果你读到这,也不用担心会讲这个玩意。)

如果你曾经了解过C++或是其它的语言里的插件框架,MEF本意就是解决这种问题的。

大意如下:

主工程中,建一个基类,然后对于每一种情况,编写了一个派生类来实现这种工作。

比如在ILSpy 中,有许多种待反编译的文件类型,如C#文件,资源文件,以及属性文件等。

但是,如果有一种现在还不想做的文件,或者是为未来预留的文件需要反编译的,这样主框架,就需要为这种能力预留接口。

但是主框架又不希望对其体系有多大破坏,这样,自然就想到了插件的方式。

世界上的实现有许多,但原理却那么几个,

如果了解COM或是其它的C++的,或是java之类的语言的插件体系,我们知道,不论如何做,有几个条件,是无法改变的:

1。 有一个所有插件共同遵守的基类或是抽象的基类,也就是所谓统一的接口。目的是受控插件接入主框架后,受主框架调度。

2。 有一套动态库加载的机制,如在win32中是loadlibrary之类的函数。

3。 有一个所有插件共同尊守的工厂函数,要说插件,com体系是比较严谨的。但COM一个最大的缺点就是与注册表依赖太大,使得一个系统中,不能有独立存在的插件,比较糟糕。而更加成功的插件,都是把DLL放在主程序身边。微软每次创新,都会搞一些退步的东西出来。

4。主框架不需要对插件形成静态依赖。

ok了,看到这,第一条,和第四条,是对我们当前的情况是有意义的。

再回头,看那段被注掉的代码,里面有一个类:

BamlResourceEntryNode

要知道,这个类在ILSpy.BamlDecompiler,这个插件中。

不用看代码我们知道,因为第四条,只能ILSpy.BamlDecompiler依赖ILSpy,而不能反向依赖。

这样,我们不能用这个类。而只能用它的基类ResourceEntryNode,或是基类接口 ILSpyTreeNode.

但老实说,这一段被注掉的代码,本质上就有问题。

因为从整个函数不清IEnumerable<Tuple<string, string>> WriteResourceFilesInProject(LoadedAssembly assembly, DecompilationOptions options, HashSet<string> directories)

来看,

作者的意思,是把界面和底层操作分开。主框架作者不想在这个函数中,用到与界面元素相关的东西。

但ResourceEntryNode是与树相关的。

但还是回到开始,是来解决我们自己的问题的,不是关心这些家伙怎么想,为达目的,有时完全会忘掉这些没用的东西。的确有许多程序员,一辈子就在框架中,没有为世界做什么贡献,结果是,一个十分钟能解决的问题,结果要一天才能掉定。所以,需要用到ResourceEntryNode。

好吧,但今天心情好,就按它的框架来试试吧。

先规划一下,要改哪些地方:

1。要生成指向ResourceEntryNode指针的BamlResourceEntryNode对象,显然,这里只能用ResourceEntryNode工厂里的Create函数。

2。 调用ResourceEntryNode里的一个可以被重载的函数,指向BamlResourceEntryNode里面的反编译函数,

3。 反编译的结果存盘。

当然,还有一个最重要的事情需要考虑,就是主框架与插件之间,如何传递数据和参数。

综合考虑,首先我们要找到那个override函数,在

ILSpyTreeNode : SharpTreeNode 中,找到:

public abstract void Decompile(Language language, ITextOutput output, DecompilationOptions options);

就它了,然后开始工作:

1)ILSpy\Languages\CSharpLanguage.cs

                             if (fileName.EndsWith(".baml", StringComparison.OrdinalIgnoreCase)) {MemoryStream ms = new MemoryStream();entryStream.CopyTo(ms);ICSharpCode.ILSpy.TreeNodes.ILSpyTreeNode node = ICSharpCode.ILSpy.TreeNodes.ResourceEntryNode.Create(fileName, ms);if (node != null){string xaml=null;try{ICSharpCode.ILSpy.TextView.AvalonEditTextOutput output = new ICSharpCode.ILSpy.TextView.AvalonEditTextOutput();node.m_assembly = assembly;node.Decompile(this, output, options);xaml= output.GetDocument().Text;}catch (System.Xaml.XamlXmlWriterException) { } // ignore XAML writer exceptionscatch (System.Exception ex){}if (xaml != null){File.WriteAllText(Path.Combine(options.SaveAsProjectDirectory, Path.ChangeExtension(fileName, ".xaml")), xaml);yield return Tuple.Create("Page", Path.ChangeExtension(fileName, ".xaml"));continue;}}

2)ILSpy.BamlDecompiler\BamlResourceEntryNode.cs

        public override void Decompile(Language language, ICSharpCode.Decompiler.ITextOutput output, DecompilationOptions options){//language.WriteCommentLine(output, string.Format("{0} = {1}", key, base.data));//AvalonEditTextOutput output = new AvalonEditTextOutput();if (LoadBaml_haoyujie((AvalonEditTextOutput)output)){//  output.}}bool LoadBaml_haoyujie(AvalonEditTextOutput output){var asm = this.m_assembly;Data.Position = 0;XDocument xamlDocument = LoadIntoDocument(asm.GetAssemblyResolver(), asm.AssemblyDefinition, Data);curstr = xamlDocument.ToString();output.Write(curstr);return true;}

得承认,的确本人是比较懒的。

为了得到asm,直接改了基类,加了一个成员变量m_assembly:

 public abstract class ILSpyTreeNode : SharpTreeNode{FilterSettings filterSettings;bool childrenNeedFiltering;public LoadedAssembly m_assembly;   //haoyujie}

好了,解决了。

另外,有处代码改了:

 public class ResourceEntryNode : ILSpyTreeNode{protected readonly string key;protected readonly Stream data;}

可执行文件

源码

ILSpy中baml转化为xaml的改进(二)相关推荐

  1. ILSpy中baml转化为xaml的改进(五)

    进一步分析BAML解析器. 因为还需要维护公司的CRM2011系统,两天没有进行这方面工作. 面对着巨量的数据,解开BAML这把锁对我目前的工作,至关重要.没有什么别的选择. 虽然前面用ILSpy,已 ...

  2. ILSpy中baml转化为xaml的改进(四)

    周一上班接着补充. 这些天状态的确低迷.上午对着电脑发了好一会呆.但活还是要干的. 上午的改进完了以后,面对一些小问题. 1.如何自动在反编译后的工程中,加入引用路径. 2. 在资源文件中,如果用到了 ...

  3. ILSpy中baml转化为xaml的改进

    这些天,正在学习.Net的框架. 找到一个较大的工程,反编译来学习. 这个框架用到了当前所有能想到的东西,如prism,Infragistics公司的插件,如RIBBON,Layoutmgr,是基于W ...

  4. ILSpy中baml转化为xaml的改进(三)

    算是和ILSpy干上了. 目前做了两步: 1) 能保存xaml了: 2)能批量保存了: 但是,工程文件没有改变,所以,装载项目后,那些xaml和cs文件,各在各的地方.难用极了. 每天都提醒自己是中国 ...

  5. TypeScript算法专题 - blog3 - 对TypeScript链表实现中的一些问题总结与改进

    TypeScript算法专题 - [单链表3] 链表的合并 以及对TypeScript链表实现中的一些问题总结与改进 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目 ...

  6. R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame)、添加标题、副标题

    R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame).添加标题.副标题. ...

  7. PDFPlumber使用入门+python实现PDF中表格转化为Excel的方法

    PDFPlumber使用入门:https://blog.csdn.net/weixin_48629601/article/details/107224376 python实现PDF中表格转化为Exce ...

  8. WPF中关于对前台Xaml中Triggers的一些重要思考。

    原文:WPF中关于对前台Xaml中Triggers的一些重要思考. 今天在做一个小Demo的时候碰到了一个比较奇怪的问题,就是其中一个Trigger始终无法执行,<Trigger Propert ...

  9. Caffe部署中的几个train-test-solver-prototxt-deploy等说明二

    Caffe部署中的几个train-test-solver-prototxt-deploy等说明<二> 发表于2016/9/15 20:39:52  1049人阅读 分类: 神经网络与深度学 ...

最新文章

  1. java 函数式编程_函数式编程杂谈
  2. net下web开发人员要掌握哪些技术才算好
  3. 【kafka】利用 InfoSphere Data Replication CDC for Kafka 实现高效数据复制
  4. PYTHON 100days学习笔记001:初识python
  5. linux for循环原理,linux for循环
  6. c++ vector使用方法收集
  7. 爱了爱了!0.052 秒打开 100GB 数据,这个开源库火爆了!
  8. 模拟美萍加密狗--Rockey2虚拟狗(一)
  9. 各种排序的时间复杂度比较
  10. 如何用MATLAB编写FIR维纳滤波器,Fir维纳滤波器的Matlab仿真
  11. 基于Layabox引擎的魔塔微信小游戏设计与实现
  12. 支配树dominator tree学习笔记
  13. 【Linux】gcc/g++的使用详解静动态库
  14. Merge用法:Oracle 10g中对Merge语句的增强
  15. HDU 1859 最小长方形
  16. 第七章 本源时空(补充)
  17. 关于diskgenius删除所有分区后,电脑不能识别U盘的问题。
  18. Hive中的left semi join和left anti join
  19. AutoCAD Civil3D 2023安装图文教程及下载
  20. 一年后反思我的围棋经历

热门文章

  1. 小学计算机教研组总结,小学信息技术中心教研组工作总结范文
  2. HP-UX 11.31 安装RAC 添加共享磁盘的问题
  3. 小白终是踏上了这条不归路----小文的mysql学习笔记目录
  4. 常见宽带路由器设置方法汇总
  5. 产业经济学古诺模型计算机,古诺模型概述及对多寡头垄断市场的推广研究
  6. 计算机网络笔记---互联网的组成及三种交换方式
  7. 猿团专访 |以技术推动发展 msup 成为企业经验智库
  8. 阿里企业云邮箱 报错 526 Authentication failure[0]
  9. iOS开发技巧--iOS app 上架(2016年10月底)以及版本迭代上架
  10. 100%都会感染,第一波症状最重,后面会轻。家里一定要备这些东西!