ILSpy中baml轉化為xaml的改進
阿新 • • 發佈:2018-12-22
這些天,正在學習.Net的框架。
找到一個較大的工程,反編譯來學習。
這個框架用到了當前所有能想到的東西,如prism,Infragistics公司的外掛,如RIBBON,Layoutmgr,是基於WPF的。
其中,想了解一下LAYOUT切換的工過程,所以分析一下XAML。
所以用到了ILSpy。
從sourceforge下載了ILSpy的程式和原始碼。
但發現一個問題,當我們另存為時,得到的baml檔案。很不方便。
所以,打算自己改改ILSpy程式。
研究了一會,找到一個地方:
public class ResourceEntryNode : ILSpyTreeNode { public override bool Save(DecompilerTextView textView) { SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = Path.GetFileName(DecompilerTextView.CleanUpName(key)); if (dlg.ShowDialog() == true) { data.Position = 0; using (var fs = dlg.OpenFile()) { data.CopyTo(fs); } } return true; } }
很快找到它的繼承類:
添加了如下程式碼:
using System.Xml; using System.Xml.Linq; using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.ILSpy; using ICSharpCode.ILSpy.TextView; using ICSharpCode.ILSpy.TreeNodes; using Mono.Cecil; using Ricciolo.StylesExplorer.MarkupReflection; using Microsoft.Win32; using System.Text; namespace ILSpy.BamlDecompiler { public sealed class BamlResourceEntryNode : ResourceEntryNode { string curstr = ""; public override bool Save(DecompilerTextView textView) { SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = Path.GetFileName(DecompilerTextView.CleanUpName(base.key)); dlg.FileName=dlg.FileName.Replace(".baml", ".xaml"); if (dlg.ShowDialog() == true) { string strCurFileName = dlg.FileName; FileStream fs=null; //定義檔案資訊物件 FileInfo finfo = new FileInfo(strCurFileName); //判斷檔案是否存在以及是否大於 if (finfo.Exists) { //刪除該檔案 finfo.Delete(); } //建立只寫檔案流 fs = finfo.OpenWrite(); //根據上面建立的檔案流建立寫資料流 using (StreamWriter w=new StreamWriter(fs, Encoding.Default)) { //設定寫資料流的起始位置為檔案流的末尾 w.BaseStream.Seek(0, SeekOrigin.Begin); w.Write(curstr); w.Flush(); w.Close(); } } return true; } }
忘了這段程式碼:
bool LoadBaml(AvalonEditTextOutput output) { var asm = this.Ancestors().OfType<AssemblyTreeNode>().FirstOrDefault().LoadedAssembly; Data.Position = 0; XDocument xamlDocument = LoadIntoDocument(asm.GetAssemblyResolver(), asm.AssemblyDefinition, Data); curstr = xamlDocument.ToString(); output.Write(curstr); return true; }
搞定
程式碼:http://download.csdn.net/detail/haoyujie/5240897
可執行程式(懶人們有福了): http://download.csdn.net/detail/haoyujie/5240882