mirror of https://github.com/icsharpcode/ILSpy.git
4 changed files with 103 additions and 51 deletions
@ -0,0 +1,63 @@
@@ -0,0 +1,63 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.IO; |
||||
using System.Reflection; |
||||
using System.Windows.Baml2006; |
||||
using System.Xaml; |
||||
using System.Xml; |
||||
|
||||
namespace ICSharpCode.ILSpy |
||||
{ |
||||
/// <remarks>Caution: use in separate AppDomain only!</remarks>
|
||||
public class BamlDecompiler : MarshalByRefObject |
||||
{ |
||||
public BamlDecompiler() |
||||
{ |
||||
} |
||||
|
||||
public string DecompileBaml(MemoryStream bamlCode, string containingAssemblyFile) |
||||
{ |
||||
bamlCode.Position = 0; |
||||
TextWriter w = new StringWriter(); |
||||
|
||||
Assembly assembly = Assembly.LoadFile(containingAssemblyFile); |
||||
|
||||
Baml2006Reader reader = new Baml2006Reader(bamlCode, new XamlReaderSettings() { ValuesMustBeString = true, LocalAssembly = assembly }); |
||||
XamlXmlWriter writer = new XamlXmlWriter(new XmlTextWriter(w) { Formatting = Formatting.Indented }, reader.SchemaContext); |
||||
while (reader.Read()) { |
||||
switch (reader.NodeType) { |
||||
case XamlNodeType.None: |
||||
|
||||
break; |
||||
case XamlNodeType.StartObject: |
||||
writer.WriteStartObject(reader.Type); |
||||
break; |
||||
case XamlNodeType.GetObject: |
||||
writer.WriteGetObject(); |
||||
break; |
||||
case XamlNodeType.EndObject: |
||||
writer.WriteEndObject(); |
||||
break; |
||||
case XamlNodeType.StartMember: |
||||
writer.WriteStartMember(reader.Member); |
||||
break; |
||||
case XamlNodeType.EndMember: |
||||
writer.WriteEndMember(); |
||||
break; |
||||
case XamlNodeType.Value: |
||||
// requires XamlReaderSettings.ValuesMustBeString = true to work properly
|
||||
writer.WriteValue(reader.Value); |
||||
break; |
||||
case XamlNodeType.NamespaceDeclaration: |
||||
writer.WriteNamespace(reader.Namespace); |
||||
break; |
||||
default: |
||||
throw new Exception("Invalid value for XamlNodeType"); |
||||
} |
||||
} |
||||
return w.ToString(); |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue