/// <summary> /// Read the given resource as byte array /// </summary> /// <param name="re">resource entry</param> /// <returns>array of bytes or <see langword="null"/> if no such resource is found</returns> public byte[] GetBytes(ResourceEntry re) { byte[] result = null; using (var stream = Open(re)) if (stream != null) { if (!(stream is MemoryStream mem)) { mem = new MemoryStream(); stream.CopyTo(mem); } result = mem.ToArray(); } return(result); }
/// <summary> /// Open the given resource entry as a readable stream /// </summary> /// <param name="entry">resource entry</param> /// <returns>readable stream or <see langword="null"/> if no such resource is found</returns> public Stream Open(ResourceEntry entry) { if (entry == null) { return(null); } var stream = Assembly.GetManifestResourceStream(entry.ResourceName); if (entry.Encryption != null && int.TryParse(entry.Compression, out var rid)) { var ct = Assembly.ManifestModule.ResolveType(rid); var decryptor = (IDecryptor)Activator.CreateInstance(ct); stream = decryptor.Decrypt(stream); } if (entry.Compression != null && int.TryParse(entry.Compression, out rid)) { var ct = Assembly.ManifestModule.ResolveType(rid); var decompressor = (IDecompressor)Activator.CreateInstance(ct); stream = decompressor.Decompress(stream); } return(stream); }
private static ResourceReader TryCreate(string name, Assembly ass) { var names = new HashSet <string>(ass.GetManifestResourceNames()); if (!names.Contains(name)) { return(null); } using (var stream = ass.GetManifestResourceStream(name)) if (stream != null) { var root = XDocument.Load(stream)?.Root; if (root?.Name != "index") { return(null); } var entries = new List <ResourceEntry>(); foreach (var node in root.Elements("entry")) { var entry = new ResourceEntry(); foreach (var attr in node.Attributes()) { entry[attr.Name.LocalName] = attr.Value; } if (entry.ResourceName != null && entry.Name != null && names.Contains(name)) { entries.Add(entry); } } if (entries.Count > 0) { return(new ResourceReader(name, ass, entries)); } } return(null); }