Esempio n. 1
0
        private XAMLFileDetails ParseXAMLFile(Assembly assembly, string resourceName, Stream stream)
        {
            XAMLFileDetails fileDetails = null;
            XDocument       document    = new XDocument();

            // Read the contents of the BAML file and decode it into a XAML document
            var reader = new Baml2006Reader(stream, new XamlReaderSettings()
            {
                ValuesMustBeString = true, LocalAssembly = assembly
            });
            var writer = new XamlXmlWriter(document.CreateWriter(), reader.SchemaContext, new XamlXmlWriterSettings()
            {
                AssumeValidInput = true
            });

            while (reader.Read())
            {
                writer.WriteNode(reader);
            }

            writer.Close();

            // Now check if it's a resource dictionary (which we ignore). If a normal view, parse it.
            XNamespace defaultNamespace = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";

            bool isResourceDictionary = (document.Root.Name == XName.Get("ResourceDictionary", defaultNamespace.NamespaceName));

            if (!isResourceDictionary)
            {
                fileDetails = new XAMLFileDetails(resourceName, document);
            }

            return(fileDetails);
        }
Esempio n. 2
0
        public static T LoadBaml <T>(Stream stream)
        {
            //For .net 3.5:
            //ParserContext parserContext = new ParserContext();
            //object[] parameters = new object[] { stream, parserContext, null, false };
            //object bamlRoot = LoadBamlMethod.Invoke(null, parameters);
            //return (T)bamlRoot;

            //For .net 4.0
            var reader = new Baml2006Reader(stream);

            var substream = reader.Value as MemoryStream;

            if (substream != null)
            {
                using (var subReader = CreateBamlFragmentReader(substream, reader.SchemaContext))
                {
                    var writer = new XamlObjectWriter(subReader.SchemaContext);
                    while (subReader.Read())
                    {
                        writer.WriteNode(subReader);
                    }
                    return((T)writer.Result);
                }
            }
            else
            {
                var writer = new XamlObjectWriter(reader.SchemaContext);
                while (reader.Read())
                {
                    writer.WriteNode(reader);
                }
                return((T)writer.Result);
            }
        }
Esempio n. 3
0
        private static Style ReadDefaultStyle(Type type)
        {
            var assembly = type.Assembly;

            using (var resourceReader = new ResourceReader(assembly.GetManifestResourceStream(assembly.GetManifestResourceNames().Single())))
            {
                foreach (DictionaryEntry entry in resourceReader)
                {
                    using (var reader = new Baml2006Reader((Stream)entry.Value))
                    {
                        using (var writer = new XamlObjectWriter(reader.SchemaContext))
                        {
                            while (reader.Read())
                            {
                                writer.WriteNode(reader);
                            }

                            var resourceDictionary = (ResourceDictionary)writer.Result;
                            if (resourceDictionary.Contains(type))
                            {
                                return((Style)resourceDictionary[type]);
                            }
                        }
                    }
                }
            }

            throw new ArgumentOutOfRangeException();
        }
Esempio n. 4
0
        private static T ReadBaml <T>(Stream stream)
        {
            var bamlReader = new Baml2006Reader(stream);
            var writer     = new XamlObjectWriter(bamlReader.SchemaContext);

            while (bamlReader.Read())
            {
                writer.WriteNode(bamlReader);
            }
            return((T)writer.Result);
        }
Esempio n. 5
0
        /// <summary>
        /// Load xaml resource stream
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static object Load(Stream stream)
        {
            var reader = new Baml2006Reader(stream);
            var writer = new XamlObjectWriter(reader.SchemaContext);

            while (reader.Read())
            {
                writer.WriteNode(reader);
            }
            return(writer.Result);
        }
Esempio n. 6
0
        /// <summary>Loads the baml.</summary>
        /// <typeparam name="TRoot">The type of the root.</typeparam>
        /// <param name="stream">The <paramref name="stream"/>.</param>
        /// <returns>the loaded <see langword="object"/> parameter</returns>
        /// <exception cref="ArgumentNullException"><paramref>
        ///         <name>reader</name>
        ///     </paramref>
        ///     is null.</exception>
        /// <exception cref="NotImplementedException">The default implementation encountered a <see cref="T:System.Xaml.XamlNodeType" /> that is not in the default enumeration.</exception>
        internal static TRoot LoadBaml <TRoot>(Stream stream)
        {
            var reader = new Baml2006Reader(stream);
            var writer = new XamlObjectWriter(reader.SchemaContext);

            while (reader.Read())
            {
                writer.WriteNode(reader);
            }

            return((TRoot)writer.Result);
        }
Esempio n. 7
0
        private static ResourceDictionary CreateEmptyResourceDictionaryInstance(Uri uri)
        {
            try
            {
                var streamInfo = Application.GetResourceStream(RebuildBamlUri(uri));

                if (streamInfo == null)
                {
                    return(null);
                }

#if !SILVERLIGHT
                if (IsBamlResource(uri))
                {
                    using (var bamlReader = new Baml2006Reader(streamInfo.Stream))
                    {
                        while (bamlReader.Read())
                        {
                            if (bamlReader.NodeType != XamlNodeType.StartObject)
                            {
                                continue;
                            }

                            if (bamlReader.Type == null)
                            {
                                return(null);
                            }

                            var objectType = bamlReader.Type.UnderlyingType;
                            if (objectType == typeof(ResourceDictionary) || objectType.IsSubclassOf(typeof(ResourceDictionary)))
                            {
                                return((ResourceDictionary)Activator.CreateInstance(objectType));
                            }
                        }
                    }
                    return(null);
                }
#endif

                using (var streamReader = new StreamReader(streamInfo.Stream, Encoding.UTF8))
                    return(GetResourceDictionary(XElement.Parse(streamReader.ReadToEnd()).Name));
            }
            catch (Exception e)
            {
                LogService.LogError(e);
            }

            return(null);
        }
Esempio n. 8
0
        public string OneBigString()
        {
            StringBuilder sb = new StringBuilder();

            try
            {
                while (_bamlReader.Read())
                {
                    _displayWriter.WriteNode(_bamlReader);
                    sb.AppendLine(_displayWriter.CurrentIndentedNodeText);
                }
            }
            catch (Exception ex)
            {
                sb.AppendLine(ex.ToString());
            }
            return(sb.ToString());
        }
Esempio n. 9
0
        private void ScanPages()
        {
            // KsWare.Presentation.UITestApp.g.resources
            var asm     = Assembly.GetEntryAssembly();
            var resName = asm.GetName().Name + ".g.resources";

            using (var stream = asm.GetManifestResourceStream(resName))
                using (var reader = new System.Resources.ResourceReader(stream)) {
                    var resources = reader.Cast <DictionaryEntry>().Select(entry => (string)entry.Key).ToArray();
                    foreach (var resource in resources)
                    {
                        if (!resource.StartsWith("pages/"))
                        {
                            continue;
                        }
                        var uri        = new Uri(resource.Substring(0, resource.Length - 5) + ".xaml", UriKind.Relative);
                        var restream   = Application.GetResourceStream(uri).Stream;
                        var bamlReader = new Baml2006Reader(restream);
                        var writer     = new XamlObjectWriter(bamlReader.SchemaContext);
                        try {
                            while (bamlReader.Read())
                            {
                                writer.WriteNode(bamlReader);
                            }
                        }
                        catch (Exception ex) {
                            var lineInfo = (IXamlLineInfo)bamlReader;
                            Debug.WriteLine($"Error loading {resource}: {lineInfo.LineNumber},{lineInfo.LinePosition}. Message: {ex.Message}");
                            MessageBox.Show($"Error loading {resource}: {lineInfo.LineNumber},{lineInfo.LinePosition}. \nMessage: \n{ex.Message}", "Error");
                            continue;
                        }
                        var xamlObject = writer.Result;
                        var name       = xamlObject.GetType().Name;

                        Pages.Add(new PageInfoVM()
                        {
                            DisplayName = name,
                            Uri         = uri,
                            View        = (FrameworkElement)xamlObject
                        });
                    }
                }
        }
Esempio n. 10
0
        public string OneBigString()
        {
            StringBuilder     sb          = new StringBuilder();
            XmlWriterSettings xmlSettings = new XmlWriterSettings
            {
                Indent             = true,
                IndentChars        = "  ",
                OmitXmlDeclaration = true
            };
            XmlWriter xmlWriter = XmlWriter.Create(sb, xmlSettings);

            _xamlWriter = new XamlXmlWriter(xmlWriter, _bamlReader.SchemaContext);
            while (_bamlReader.Read())
            {
                _xamlWriter.WriteNode(_bamlReader);
            }
            xmlWriter.Flush();
            xmlWriter.Close();
            return(sb.ToString());
        }
Esempio n. 11
0
        private BamlControl LoadBaml(string name)
        {
            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            if (assemblyName == "")
            {
                assemblyName = Language.GetAssemblyName(Assembly.GetCallingAssembly());
            }

            string language = Language.Id;

            if (language == "")
            {
                language = Thread.CurrentThread.CurrentUICulture.ToString();
            }

            string bamlName = name.ToLower() + ".baml";

            // Get the name of g-resource
            string resourceName = assemblyName + ".g";

            if ((language != "") && (language != Language.OriginalId))
            {
                resourceName = resourceName + "." + language;
            }

            resourceName = resourceName + ".resources";

            Stream      stream  = assembly.GetManifestResourceStream(resourceName);
            BamlControl current = null;

            using (var resourceReader = new ResourceReader(stream))
            {
                foreach (DictionaryEntry entry in resourceReader)
                {
                    if (entry.Key.ToString() == bamlName)
                    {
                        Stream bamlStream = entry.Value as Stream;

                        var    bamlReader = new Baml2006Reader(bamlStream);
                        string memberName = "";

                        var baml = new BamlControl();
                        current = null;

                        while (bamlReader.Read())
                        {
                            XamlNodeType nodeType = bamlReader.NodeType;

                            switch (bamlReader.NodeType)
                            {
                            case XamlNodeType.StartObject:
                                if (current == null)
                                {
                                    current = baml;
                                }
                                else
                                {
                                    current = current.Add(new BamlControl());
                                }

                                if (bamlReader.Type != null)
                                {
                                    current.ElementName = bamlReader.Type.ToString();
                                }

                                break;

                            case XamlNodeType.GetObject:
                                current            = current.Add(new BamlControl());
                                current.MemberName = memberName;
                                break;

                            case XamlNodeType.EndObject:
                                if (current != null)
                                {
                                    current = current.Parent;
                                }

                                break;

                            case XamlNodeType.StartMember:
                                memberName = bamlReader.Member.Name;
                                break;

                            case XamlNodeType.EndMember:
                                memberName = "";
                                break;

                            case XamlNodeType.Value:
                                if (memberName == "Name")
                                {
                                    current.Name = bamlReader.Value.ToString();
                                }
                                else if (memberName == "Uid")
                                {
                                    current.Uid = bamlReader.Value.ToString();
                                }
                                else if (memberName == "Content")
                                {
                                    current.Value = bamlReader.Value;
                                }
                                else if (memberName != "")
                                {
                                    current.AddProperty(memberName, bamlReader.Value);
                                }

                                break;
                            }
                        }

                        return(baml);
                    }
                }
            }

            return(null);
        }
Esempio n. 12
0
        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
            });
            XDocument     doc    = new XDocument();
            XamlXmlWriter writer = new XamlXmlWriter(doc.CreateWriter(), 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");
                }
            }
            writer.Close();

            // Fix namespace references
            string suffixToRemove = ";assembly=" + assembly.GetName().Name;

            foreach (XAttribute attrib in doc.Root.Attributes())
            {
                if (attrib.Name.Namespace == XNamespace.Xmlns)
                {
                    if (attrib.Value.EndsWith(suffixToRemove, StringComparison.Ordinal))
                    {
                        string newNamespace = attrib.Value.Substring(0, attrib.Value.Length - suffixToRemove.Length);
                        ChangeXmlNamespace(doc, attrib.Value, newNamespace);
                        attrib.Value = newNamespace;
                    }
                }
            }
            // Convert x:Key into an attribute where possible
            XName xKey = XName.Get("Key", "http://schemas.microsoft.com/winfx/2006/xaml");

            foreach (XElement e in doc.Descendants(xKey).ToList())
            {
                if (e.Nodes().Count() != 1)
                {
                    continue;
                }
                XText text = e.Nodes().Single() as XText;
                if (text != null)
                {
                    e.Parent.SetAttributeValue(xKey, text.Value);
                    e.Remove();
                }
            }

            return(doc.ToString());
        }
Esempio n. 13
0
        static void Main(string[] args)
        {
            XmlConfigurator.Configure();

            string        oldFolder = @"C:\";
            string        newFolder = @"C:\";
            DirectoryInfo oldDi     = new DirectoryInfo(oldFolder);
            DirectoryInfo newDi     = new DirectoryInfo(newFolder);

            if (oldDi.Exists && newDi.Exists)
            {
                FileInfo[] oldGenDll = oldDi.GetFiles(FILTER);
                FileInfo[] newGenDll = newDi.GetFiles(FILTER);

                if (oldGenDll.Length != newGenDll.Length)
                {
                    log.Info(string.Format("oldGenDll.Length = {0}, newGenDll.Length = {1}", oldGenDll.Length, newGenDll.Length));

                    // Compare names:
                    throw new NotImplementedException();
                }

                foreach (FileInfo fiOld in oldGenDll)
                {
                    FileInfo fiNew = newGenDll.Where(t => t.Name.Equals(fiOld.Name)).FirstOrDefault();

                    ModuleDefinition oldModule = ModuleDefinition.ReadModule(fiOld.FullName);
                    var oldTypes = oldModule.Types;
                    ModuleDefinition newModule = ModuleDefinition.ReadModule(fiNew.FullName);
                    var newTypes = newModule.Types;

                    if (oldTypes.Count != newTypes.Count)
                    {
                        Append2Dictionary(fiOld.Name, string.Format("oldTypes.Count = {0}, newTypes.Count = {1}", oldTypes.Count, newTypes.Count));

                        // Compare names:
                        var oldNames = oldTypes.Select(t => t.Name).ToList();
                        var newNames = newTypes.Select(t => t.Name).ToList();

                        CompareNames(fiOld.Name, oldNames, newNames, "Types Added", "Types Removed");
                    }

                    foreach (TypeDefinition oldType in oldTypes)
                    {
                        if (!oldType.IsInterface && !IsClassImplementInterfaceInList(oldType, MyInterfaces))
                        {
                            continue;
                        }

                        TypeDefinition newType = newTypes.Where(t => t.Name.Equals(oldType.Name)).FirstOrDefault();
                        if (newType == null)
                        {
                            continue;
                        }

                        //if (!MyInterfaces.Contains(oldType.Name))
                        //    continue;

                        var allOldMethods = oldType.Methods;
                        var allnewMethods = newType.Methods;

                        if (allOldMethods.Count != allnewMethods.Count)
                        {
                            Append2Dictionary(oldType.Name, string.Format("allOldMethods.Count = {0}, allnewMethods.Count = {1}", allOldMethods.Count, allnewMethods.Count));

                            // Compare names:
                            var oldNames = allOldMethods.Select(t => t.Name).ToList();
                            var newNames = allnewMethods.Select(t => t.Name).ToList();
                            CompareNames(oldType.Name, oldNames, newNames, "Methods Added", "Methods Removed");
                        }

                        foreach (MethodDefinition oldMdef in allOldMethods)
                        {
                            MethodDefinition newMdef = allnewMethods.Where(t => t.Name.Equals(oldMdef.Name)).FirstOrDefault();
                            if (newMdef == null)
                            {
                                continue;
                            }

                            string cSharpCodeDisAssembOld = getSourceCode(oldMdef);
                            if (string.IsNullOrWhiteSpace(cSharpCodeDisAssembOld))
                            {
                                continue;
                            }
                            string cSharpCodeDisAssembNew = getSourceCode(newMdef);
                            if (cSharpCodeDisAssembOld != cSharpCodeDisAssembNew)
                            {
                                Append2Dictionary(oldType.Name, TAB + oldMdef.Name + " are differents.");
                            }
                        }
                    }


                    // xaml
                    if (oldModule.Resources.Count > 0)
                    {
                        EmbeddedResource rOld      = (EmbeddedResource)oldModule.Resources.Where(r => r.Name.Contains(".g.")).FirstOrDefault();
                        ResourceReader   readerOld = null;
                        using (var stream = rOld.GetResourceStream())
                        {
                            using (readerOld = new ResourceReader(stream))
                            {
                                EmbeddedResource rNew      = (EmbeddedResource)newModule.Resources.Where(r => r.Name.Contains(".g.")).FirstOrDefault();
                                ResourceReader   readerNew = null;
                                using (var stream2 = rNew.GetResourceStream())
                                {
                                    using (readerNew = new ResourceReader(stream2))
                                    {
                                        foreach (DictionaryEntry entry in readerOld)
                                        {
                                            ///Read the values in the entry
                                            if (!entry.Key.ToString().Contains(BAML_EXTENSION))
                                            {
                                                continue;
                                            }
                                            string fullName         = entry.Key.ToString();
                                            int    indexOfLastSlash = fullName.LastIndexOf(@"/");
                                            int    indexOfDotBaml   = fullName.IndexOf(BAML_EXTENSION);
                                            string className        = entry.Key.ToString().Substring(indexOfLastSlash + 1, indexOfDotBaml - indexOfLastSlash - 1);

                                            var classOfThisBaml = oldTypes.Where(t => t.Name.ToLower().Equals(className)).FirstOrDefault();

                                            if (classOfThisBaml == null || (!classOfThisBaml.IsInterface && !IsClassImplementInterfaceInList(classOfThisBaml, MyInterfaces)))
                                            {
                                                continue;
                                            }

                                            //var newClassOfThisBaml = newTypes.Where(t => t.Name.ToLower().Equals(className)).FirstOrDefault();
                                            System.IO.MemoryStream codeofOldBaml = entry.Value as MemoryStream;
                                            string oldCode = string.Empty;
                                            using (StreamReader oldStreamR = new StreamReader(codeofOldBaml as Stream, Encoding.UTF8))
                                            {
                                                oldCode = oldStreamR.ReadToEnd();
                                                oldStreamR.Close();
                                            }

                                            Baml2006Reader reader = new Baml2006Reader(codeofOldBaml as Stream);
                                            while (!reader.IsEof)
                                            {
                                                var noeud = reader.Value;
                                                reader.Read();
                                            }
                                            //var writer = new XamlObjectWriter(reader.SchemaContext);
                                            //while (reader.Read())
                                            //    writer.WriteNode(reader);

                                            string typeofNewBaml = string.Empty;
                                            byte[] codeofNewBaml = null;
                                            readerNew.GetResourceData(fullName, out typeofNewBaml, out codeofNewBaml);
                                            // en fait le baml est un code précompilé, reste à trouver comment le décompiler en xaml
                                            string newcode = Encoding.UTF8.GetString(codeofNewBaml);
                                        }
                                        stream2.Close();
                                    }
                                    readerNew.Close();
                                }
                            }
                            readerOld.Close();

                            stream.Close();
                        }
                    }

                    // print
                    //if (bufferInfo.Count > 1)
                    {
                        foreach (var item in bufferInfo)
                        {
                            log.Info(item.Key);
                            foreach (var line in item.Value)
                            {
                                log.Info(line);
                            }
                        }
                        if (bufferInfo.Count > 0)
                        {
                            NewLine();
                        }
                    }

                    bufferInfo.Clear();
                }
            }
        }