1. 程式人生 > >ILSpy中baml轉化為xaml的改進

ILSpy中baml轉化為xaml的改進

 這些天,正在學習.Net的框架。

找到一個較大的工程,反編譯來學習。

這個框架用到了當前所有能想到的東西,如prism,Infragistics公司的外掛,如RIBBON,Layoutmgr,是基於WPF的。

其中,想了解一下LAYOUT切換的工過程,所以分析一下XAML。

所以用到了ILSpy。

從sourceforge下載了ILSpy的程式和原始碼。

但發現一個問題,當我們另存為時,得到的baml檔案。很不方便。

但發現一個問題,當我們另存為時,得到的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