public BamlDocument Analyze(ModuleDefMD module, string bamlName, byte[] data) { this.module = module; this.bamlName = bamlName; if (module.IsClr40) { things = thingsv4 ?? (thingsv4 = new KnownThingsv4(context, module)); } else { things = thingsv3 ?? (thingsv3 = new KnownThingsv3(context, module)); } Debug.Assert(BitConverter.ToInt32(data, 0) == data.Length - 4); BamlDocument document = BamlReader.ReadDocument(new MemoryStream(data, 4, data.Length - 4)); // Remove debug infos document.RemoveWhere(rec => rec is LineNumberAndPositionRecord || rec is LinePositionRecord); // Populate references PopulateReferences(document); // Process elements BamlElement rootElem = BamlElement.Read(document); BamlElement trueRoot = rootElem.Children.Single(); var stack = new Stack<BamlElement>(); stack.Push(rootElem); while (stack.Count > 0) { BamlElement elem = stack.Pop(); ProcessBAMLElement(trueRoot, elem); foreach (BamlElement child in elem.Children) stack.Push(child); } return document; }
public BamlDocument Analyze(ModuleDefMD module, string bamlName, byte[] data) { this.module = module; this.bamlName = bamlName; if (module.IsClr40) { things = thingsv4 ?? (thingsv4 = new KnownThingsv4(context, module)); } else { things = thingsv3 ?? (thingsv3 = new KnownThingsv3(context, module)); } Debug.Assert(BitConverter.ToInt32(data, 0) == data.Length - 4); BamlDocument document = BamlReader.ReadDocument(new MemoryStream(data, 4, data.Length - 4)); // Remove debug infos document.RemoveWhere(rec => rec is LineNumberAndPositionRecord || rec is LinePositionRecord); // Populate references PopulateReferences(document); // Process elements BamlElement rootElem = BamlElement.Read(document); BamlElement trueRoot = rootElem.Children.Single(); var stack = new Stack <BamlElement>(); stack.Push(rootElem); while (stack.Count > 0) { BamlElement elem = stack.Pop(); ProcessBAMLElement(trueRoot, elem); foreach (BamlElement child in elem.Children) { stack.Push(child); } } return(document); }