Search code examples
c#embedded-resource

Extract embedded resources in C#


I have four resource files embedded in my C# executable, 1 python script and 3 perl scripts. I could extract all three perl scripts successfully. But I am not able to extract the python script. I tried so many ways. Could someone please have a look ? Thank you.

public static string ExtractResource(string resourceName)
{
    string destFile = "";

    //look for the resource name
    foreach (string currentResource in System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() )
        if (currentResource.LastIndexOf(resourceName) != -1)
        {
            string subPath = Common_Utilities.GetTempPath() + "SCRIPTS"; 
            bool isExists = System.IO.Directory.Exists(subPath);

            if (!isExists)
               System.IO.Directory.CreateDirectory(subPath);

            string strFile = subPath + "\\" + resourceName;
            string path = System.IO.Path.GetDirectoryName(strFile);
            string rootName = System.IO.Path.GetFileNameWithoutExtension(strFile);
            destFile = path + @"\" + rootName + System.IO.Path.GetExtension(currentResource);

            System.IO.Stream fs = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream( currentResource ) ;

            byte[] buff = new byte[fs.Length];
            fs.Read(buff, 0, (int)fs.Length);
            fs.Close();

            System.IO.FileStream destStream = new System.IO.FileStream(destFile, FileMode.Create);
            destStream.Write(buff, 0, buff.Length);
            destStream.Close();
    }

    return destFile;
    // throw new Exception("Resource not found : " + resourceName);
}

Solution

  • Not sure why the Python script can't be extracted.... couple points though:

    1. I would recommend to use Path.Combine() to stick together path and file name - don't do this yourself, too many chances for error!

    2. Since those are (text-based) scripts, you could do the whole copying much simpler:

       System.IO.Stream fs = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(currentResource);
      
       string scriptContents = new StreamReader(fs).ReadToEnd();
       File.WriteAllText(destFile, scriptContents); 
      

      With this approach, you should be easily able to see in debugging whether or not the script is properly loaded from resources. If not - check your resource name etc. (is the script really set to "embedded" resource?). If you have subdirectories for your resources, be aware that the resource name will contain those subdirectories as part of the fully qualified name - but separated by a dot (.), not a backslash like a physical path!