周一上班接着补充。

这些天状态的确低迷。上午对着电脑发了好一会呆。但活还是要干的。

上午的改进完了以后,面对一些小问题。

1。如何自动在反编译后的工程中,加入引用路径。

2。 在资源文件中,如果用到了模板类,则编不过。

  • 如何自动在反编译后的工程中,加入引用路径。

这个走了一点弯路。原以来为这个信息在.csproj文件,原来不是这样,而是在.csproj.user中。

有些吃惊,一直以为那个文件没有用。

先说一下为什么要有这样的需求:

因为正在看的程序,内容很多,但所感兴趣的东西,只是冰山一角,虽然这个一角也不小,所以,只需要看几个DLL就OK了。

但这些DLL是引用了其它的DLL的,所以,加引用路径是最简单的事情。当然,可以事先把一些可以注册的库用:gacutil /i
注册一下,也是个办法。

这里选择用引用路径。

发现引用路径在.csproj.user中,就好办了,只要找到一个地方,加一段代码就OK了:

在:ILSpy\TextView\DecompilerTextView.cs

中改进一下如下的代码就OK了。

Task<AvalonEditTextOutput> SaveToDiskAsync(DecompilationContext context, string fileName){TaskCompletionSource<AvalonEditTextOutput> tcs = new TaskCompletionSource<AvalonEditTextOutput>();Thread thread = new Thread(new ThreadStart(delegate {try {Stopwatch stopwatch = new Stopwatch();stopwatch.Start();//haoyujie 写入工程文件using (StreamWriter w = new StreamWriter(fileName)) {try {DecompileNodes(context, new PlainTextOutput(w));} catch (OperationCanceledException) {w.WriteLine();w.WriteLine("Decompiled was cancelled.");throw;}}//把user设置拷到指定位置//最后,把引用路径模板拷过去,因为需要引用许多其它的库,引用路径在这个文件中指定string strUserTmppath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory + "hayujie_usertmp.usertmp");string strDescUserpath = fileName + ".user";FileInfo fi = new FileInfo(strUserTmppath);if (File.Exists(strDescUserpath)){File.Delete(strDescUserpath);}fi.CopyTo(strDescUserpath);stopwatch.Stop();AvalonEditTextOutput output = new AvalonEditTextOutput();output.WriteLine("Decompilation complete in " + stopwatch.Elapsed.TotalSeconds.ToString("F1") + " seconds.");output.WriteLine();output.AddButton(null, "Open Explorer", delegate { Process.Start("explorer", "/select,\"" + fileName + "\""); });output.WriteLine();tcs.SetResult(output);} catch (OperationCanceledException) {tcs.SetCanceled();#if DEBUG} catch (AggregateException ex) {tcs.SetException(ex);#else} catch (Exception ex) {tcs.SetException(ex);#endif}}));thread.Start();return tcs.Task;}

至于里面提到的模板文件hayujie_usertmp.usertmp,可以自己想名字,内容也可以自己写,给出一个例子:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><ReferencePath>E:\work\lib\</ReferencePath></PropertyGroup>
</Project>

提不起精神,感觉代码写得对不起观众。

  • 在资源文件中,如果用到了模板类,则编不过。

在反编译过程中,发现有一个resource.baml反编译不成功。

仔细分析后一天多,才明白,这里面用到了模板类,不了解在C#中叫什么,在C++里要模板,

也就是说,在一个核心库中定义了一个模板类,然后这个模板类的实现(c#是不是叫装箱),相当于一个类,在使用者的库中才被编译器实现,也就是说,实际上它在两个地方,当然在C++只会存在于一个地方,因为C++的模板,是预编译阶段完成的。

但好象C#的实现,有点象容器(所以模板在C#中好象就叫容器类),两边的库都要用到,这也容易理解,C#是解释性语言。

各有各的好外,总得来说,还是装箱这种方式,简单得多。

而这个类,恰好被resource.baml里面引用到了。而ILSPY就是错了。

具体出错的内容

模板类名`[[实现类的命名空间,类名,版本号,KEY]]

注意,那个`,是最奇怪的,不清楚是怎么出来的,60H,就是键盘上esc 下面的那个键。见鬼啊。

而正常的类名,只有一个模板类名。然后ILSpy ,以大无畏的猜测的精视,猜出前面是命名空间,后面是类名,当然,大多数时候,它都是对的。

对微软的统一语言进行时的二进制码不熟,所以,一步步逆推到这,就停下了,因为再整,就对不起老板给开的工资了,毕竟还有工作要做。

如果有哥们对二进制码非常熟的,请告知。

从内存中,看到ILSPY对于模板类的反编译,并不正确之后,决定稍稍修剪一下代码,虽然结果不完全正确,也总比什么都不出来强。

后来,真的可用了。

这里,把改完的代码放在这里:

ILSpy.BamlDecompiler\Ricciolo.StylesExplorer.MarkupReflection\XmlBamlReader.cs

     void ReadTypeInfo(){short typeId = reader.ReadInt16();short assemblyId = reader.ReadInt16();string fullName = reader.ReadString();assemblyId = (short)(assemblyId & 0xfff);TypeDeclaration declaration;int indexpp = fullName.IndexOf("[[");    //说明这个类是模板类if (indexpp >= 0){int indexppend = fullName.IndexOf("]]");    //说明这个类是模板类fullName=fullName.Substring(indexpp+2,indexppend-indexpp-2);}if (fullName.IndexOf(',')>=0){int douhao = fullName.IndexOf(',');fullName = fullName.Substring(0,douhao);}int length = fullName.LastIndexOf('.');if (length != -1){string name = fullName.Substring(length + 1);string namespaceName = fullName.Substring(0, length);declaration = new TypeDeclaration(this, this.Resolver, name, namespaceName, assemblyId);}else{declaration = new TypeDeclaration(this, this.Resolver, fullName, string.Empty, assemblyId);}this.typeTable.Add(typeId, declaration);}

这段代码,对原有的代码进行了修改,最后可以工作,但结果应该是不正确的,但也不耽误用了。

另外,这里,把在逆推的过程中,用到的代码,也贴出来,减少大家逆推的时间。

因为逆推有几个难题:

1。 出错的时候,读入错误信息的地方,早就过去了。

2。文件流stream,是顺序的,不是随机的,这样,就不能再读一次。

所以,加了这段代码分析内存:

ILSpy.BamlDecompiler\Ricciolo.StylesExplorer.MarkupReflection\BamlBinaryReader.cs

public override string ReadString(){//haoyujie,为调试资源错误,因为现在在资源中,如果出现模板类,就会出错。string strInner = base.ReadString();if (strInner.StartsWith("出错的那个模板的类的名称"))  //这句是重点,加入拦截{int ll = 500;Stream basestream = base.BaseStream;byte[] buffer = new byte[ll];if (basestream.CanSeek){basestream.Seek(-ll, SeekOrigin.Current);}buffer = base.ReadBytes(ll);}return strInner;}

就这么多吧。

这个系列,也就基本上结束了。

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

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

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

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

    前一篇中,只是对单一文件保存,进行了改进. 但在反编译时,还要一个一个的处理. 面对海量的代码,更需要一个能将所有的保存的工具.磨刀不误砍柴工,再改进一下工具. 首先找到在: ILSpy\Langua ...

  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. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

最新文章

  1. 万能make file
  2. 12月27日云栖精选夜读:实人认证 - 阿里云实人认证(公测)发布
  3. How does JdkRegexpMethodPointcut work
  4. 浏览器加载渲染HTML、DOM、CSS、 JAVASCRIPT、IMAGE、FLASH、IFRAME、SRC属性等资源的顺序总结...
  5. 湖南单招计算机专业大学排名,2021湖南单招学校排名及分数线:湖南单招分数线高吗?...
  6. SQL Server高级查询之常见数据库对象(视图)第五章节
  7. Unity AnimatorController 混合树 状态机 骨骼
  8. NVM:使用nvm安装管理node版本
  9. zbar扫描二维码,条维码
  10. 40_ZYNQ7020开发板RS485协议通信
  11. 侧信道攻击之模板攻击
  12. 使用HTML图片热区area map制作区域地图的选择高亮效果
  13. 基于springboot房屋租赁管理系统 (源代码+数据库)
  14. kvm迁移镜像启动报错
  15. Android 中的卡顿丢帧原因概述 - 低内存篇
  16. IOS - 怎么辨别苹果手机的数据线是否原装?
  17. vue、html 实现头尾固定,中间滚动的布局(移动端常见的布局)
  18. AutoJs学习-悬浮单任务计时器
  19. 安装完ps2019显示计算机丢失,安装ps2019时出现错误代码146
  20. sublime3生成html头部按tab键没反应

热门文章

  1. Linux 常用命令行、配置
  2. 【蓝月传奇3D】手游辅助脚本(多开/练级/日常/BOSS/活动等)
  3. iOS、Mac开源项目记录 - From TimLiu-iOS
  4. python 读文件 如何从第二行开始
  5. python 股票市场分析实战
  6. 面向应用CMDB,来自优维科技与国信证券的实践
  7. 华为/H3C常用巡检命令
  8. 计算机网络国际会议排名,科学网—计算机相关国际会议排名 - 刘耀的博文
  9. 利用百度进行人脸识别
  10. 2019, XII Samara Regional Intercollegiate Programming Contest