public void PostRename(ConfuserContext context, INameService service, ProtectionParameters parameters, IDnlibDef def) { var module = def as ModuleDefMD; if (module == null) { return; } var wpfResInfo = context.Annotations.Get <Dictionary <string, Dictionary <string, BamlDocument> > >(module, BAMLKey); if (wpfResInfo == null) { return; } foreach (var res in module.Resources.OfType <EmbeddedResource>()) { Dictionary <string, BamlDocument> resInfo; if (!wpfResInfo.TryGetValue(res.Name, out resInfo)) { continue; } var stream = new MemoryStream(); var writer = new ResourceWriter(stream); res.Data.Position = 0; var reader = new ResourceReader(new ImageStream(res.Data)); var enumerator = reader.GetEnumerator(); while (enumerator.MoveNext()) { var name = (string)enumerator.Key; string typeName; byte[] data; reader.GetResourceData(name, out typeName, out data); BamlDocument document; if (resInfo.TryGetValue(name, out document)) { var docStream = new MemoryStream(); docStream.Position = 4; BamlWriter.WriteDocument(document, docStream); docStream.Position = 0; docStream.Write(BitConverter.GetBytes((int)docStream.Length - 4), 0, 4); data = docStream.ToArray(); name = document.DocumentName; } writer.AddResourceData(name, typeName, data); } writer.Generate(); res.Data = MemoryImageStream.Create(stream.ToArray()); } }
public static byte[] ToResourceBytes(BamlDocument document) { using (var targetStream = new MemoryStream()) { BamlWriter.WriteDocument(document, targetStream); targetStream.Position = 0; return(BitConverter.GetBytes((int)targetStream.Length).Concat(targetStream.ToArray()).ToArray()); } }
private void WriteDocuments(List <BamlDocument> documents) { var indexedDocuments = documents.ToDictionary(x => x.DocumentName); var newResources = new List <EmbeddedResource>(); foreach (var resource in Module.Resources.OfType <EmbeddedResource>()) { using (var stream = new MemoryStream()) { using (var resourceWriter = new ResourceWriter(stream)) { using (var resourceStream = resource.CreateReader().AsStream()) { using (var resourceReader = new ResourceReader(resourceStream)) { var enumerator = resourceReader.GetEnumerator(); while (enumerator.MoveNext()) { var name = (string)enumerator.Key; resourceReader.GetResourceData(name, out var typeName, out var data); if (indexedDocuments.TryGetValue(name, out var document)) { using (var documentStream = new MemoryStream()) { documentStream.Position = 4; BamlWriter.WriteDocument(document, documentStream); documentStream.Position = 0; documentStream.Write(BitConverter.GetBytes((int)documentStream.Length - 4), 0, 4); data = documentStream.ToArray(); } } resourceWriter.AddResourceData(name, typeName, data); } } } resourceWriter.Generate(); newResources.Add(new EmbeddedResource(resource.Name, stream.ToArray(), resource.Attributes)); } } } foreach (var resource in newResources) { var index = Module.Resources.IndexOfEmbeddedResource(resource.Name); Module.Resources[index] = resource; } }
public void UpdateReference(Identifier old, Identifier @new) { EmbeddedResource res = mod.Resources[resId] as EmbeddedResource; foreach (KeyValuePair <string, BamlDocument> pair in (res as IAnnotationProvider).Annotations["Gbamls"] as Dictionary <string, BamlDocument> ) { Stream dst = new MemoryStream(); BamlWriter.WriteDocument(pair.Value, dst); ((res as IAnnotationProvider).Annotations["Gresources"] as Dictionary <string, object>)[pair.Key] = dst; } MemoryStream newRes = new MemoryStream(); ResourceWriter wtr = new ResourceWriter(newRes); foreach (KeyValuePair <string, object> pair in (res as IAnnotationProvider).Annotations["Gresources"] as Dictionary <string, object> ) { wtr.AddResource(pair.Key, pair.Value); } wtr.Generate(); mod.Resources[resId] = new EmbeddedResource(res.Name, res.Attributes, newRes.ToArray()); }
private EmbeddedResource ReloadResource(EmbeddedResource resource) { ResourceReader reader; try { reader = new ResourceReader(resource.CreateReader().AsStream()); } catch (ArgumentException) { Console.WriteLine("This resource can not be parsed."); return(resource); } MemoryStream m = new MemoryStream(); ResourceWriter writer = new ResourceWriter(m); var e = reader.GetEnumerator(); while (e.MoveNext()) { if (BamlFiles.ContainsKey(e.Key.ToString())) { //MARK:AF 3E 00 00 using var ms = new MemoryStream(); BamlWriter.WriteDocument(BamlFiles[e.Key.ToString()], ms); writer.AddResource(e.Key.ToString(), ms.ToArray()); } else { writer.AddResource(e.Key.ToString(), e.Value); } } //writer.AddResource(e.Key.ToString(), e.Value); writer.Generate(); EmbeddedResource embedded = new EmbeddedResource(resource.Name, m.ToArray()); writer.Close(); return(embedded); }