How to Read an embedded resource as array of bytes without writing it to disk?

Solution 1:

You are actually already reading the stream to a byte array, why not just stop there?

public static byte[] ExtractResource(String filename)
{
    System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
    using (Stream resFilestream = a.GetManifestResourceStream(filename))
    {
        if (resFilestream == null) return null;
        byte[] ba = new byte[resFilestream.Length];
        resFilestream.Read(ba, 0, ba.Length);
        return ba;
    }
}

edit: See comments for a preferable reading pattern.

Solution 2:

Simple alternative using a MemoryStream:

var ms = new MemoryStream();
await resFilestream.CopyToAsync(ms);
var bytes = ms.ToArray();

Solution 3:

Keep in mind that Embedded resource filename = Assemblyname.fileName

string fileName = "test.pdf";
System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
string fileName = a.GetName().Name + "." + "test.pdf";

using (Stream resFilestream = a.GetManifestResourceStream(fileName))
{
    if (resFilestream == null) return null;
    byte[] ba = new byte[resFilestream.Length];
    resFilestream.Read(ba, 0, ba.Length);
    var byteArray = ba;
}

Solution 4:

if you are reading an embeded resource here is a simple way to do so.

string resourcePath = "pack://application:,,,/resource/location/S_2/{0}";
        StreamResourceInfo resInfo = Application.GetResourceStream(new Uri(resourcePath));

        if (resInfo == null)
        {
            throw new Exception("Resource not found: " + resourcePath);
        }

        var ms = new System.IO.MemoryStream();
        await resInfo.Stream.CopyToAsync(ms);
        byte[] bytes = ms.ToArray();