private void Pack(Stream output, List <Source> sources) { var offsets = new Dictionary <Source, int>(); var coffset = 0; foreach (var s in sources) { offsets[s] = coffset; coffset += s.Size; } var index = sources.Select(s => new AvaloniaResourcesIndexEntry { Path = s.Path, Size = s.Size, Offset = offsets[s] }).ToList(); var ms = new MemoryStream(); AvaloniaResourcesIndexReaderWriter.Write(ms, index); new BinaryWriter(output).Write((int)ms.Length); ms.Position = 0; ms.CopyTo(output); foreach (var s in sources) { using (var input = s.Open()) input.CopyTo(output); } }
public void Save() { if (_embedded != null) { _asm.MainModule.Resources.Remove(_embedded); _embedded = null; } if (_resources.Count == 0) { return; } _embedded = new EmbeddedResource("!AvaloniaResources", ManifestResourceAttributes.Public, AvaloniaResourcesIndexReaderWriter.Create(_resources.ToDictionary(x => x.Key, x => x.Value.FileContents))); _asm.MainModule.Resources.Add(_embedded); }
public AvaloniaResources(AssemblyDefinition asm, string projectDir) { _asm = asm; _embedded = ((EmbeddedResource)asm.MainModule.Resources.FirstOrDefault(r => r.ResourceType == ResourceType.Embedded && r.Name == "!AvaloniaResources")); if (_embedded == null) { return; } using (var stream = _embedded.GetResourceStream()) { var br = new BinaryReader(stream); var index = AvaloniaResourcesIndexReaderWriter.Read(new MemoryStream(br.ReadBytes(br.ReadInt32()))); var baseOffset = stream.Position; foreach (var e in index) { stream.Position = e.Offset + baseOffset; _resources[e.Path] = new AvaloniaResource(this, projectDir, e.Path, br.ReadBytes(e.Size)); } } }
public AssemblyDescriptor(Assembly assembly) { Assembly = assembly; if (assembly != null) { Resources = assembly.GetManifestResourceNames() .ToDictionary(n => n, n => (IAssetDescriptor) new AssemblyResourceDescriptor(assembly, n)); Name = assembly.GetName().Name; using (var resources = assembly.GetManifestResourceStream(AvaloniaResourceName)) { if (resources != null) { Resources.Remove(AvaloniaResourceName); var indexLength = new BinaryReader(resources).ReadInt32(); var index = AvaloniaResourcesIndexReaderWriter.Read(new SlicedStream(resources, 4, indexLength)); var baseOffset = indexLength + 4; AvaloniaResources = index.ToDictionary(r => "/" + r.Path !.TrimStart('/'), r => (IAssetDescriptor) new AvaloniaResourceDescriptor(assembly, baseOffset + r.Offset, r.Size)); } } } }