Exemplo n.º 1
0
 /// <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);
 }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        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);
        }