如何从嵌入式资源中提取文件并将其保存到磁盘?

Raf*_*ari 48 .net c# embedded-resource csharpcodeprovider

我正在尝试使用CSharpCodeProvider编译下面的代码.该文件已成功编译,但是当我单击生成的EXE文件时,我收到错误(Windows正在搜索此问题的解决方案)并且没有任何反应.

当我使用CSharpCodeProvider编译下面的代码时,我MySql.Data.dll使用以下代码行添加了作为嵌入式资源文件:

if (provider.Supports(GeneratorSupport.Resources))
    cp.EmbeddedResources.Add("MySql.Data.dll");
Run Code Online (Sandbox Code Playgroud)

该文件已成功嵌入(因为我注意到文件大小增加).

在下面的代码中,我尝试提取嵌入的DLL文件并将其保存到System32,但下面的代码由于某种原因不起作用.

namespace ConsoleApplication1
{
    class Program
    {
        public static void ExtractSaveResource(String filename, String location)
        {
            //Assembly assembly = Assembly.GetExecutingAssembly();
            Assembly a = .Assembly.GetExecutingAssembly();
            //Stream stream = assembly.GetManifestResourceStream("Installer.Properties.mydll.dll"); // or whatever
            //string my_namespace = a.GetName().Name.ToString();
            Stream resFilestream = a.GetManifestResourceStream(filename);
            if (resFilestream != null)
            {
                BinaryReader br = new BinaryReader(resFilestream);
                FileStream fs = new FileStream(location, FileMode.Create); // Say
                BinaryWriter bw = new BinaryWriter(fs);
                byte[] ba = new byte[resFilestream.Length];
                resFilestream.Read(ba, 0, ba.Length);
                bw.Write(ba);
                br.Close();
                bw.Close();
                resFilestream.Close();
            }
            // this.Close();
        }

        static void Main(string[] args)
        {
            try
            {
                string systemDir = Environment.SystemDirectory;
                ExtractSaveResource("MySql.Data.dll", systemDir);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何提取作为资源嵌入的DLL文件并将其保存到System32?

Pio*_*fer 69

我建议你做得更容易.我假设资源存在且文件是可写的(如果我们谈论系统目录,这可能是一个问题).

public void WriteResourceToFile(string resourceName, string fileName)
{
    using(var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
    {
        using(var file = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            resource.CopyTo(file);
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是.NET 4.0或更高版本 (5认同)
  • 回答我自己的问题:_Namespace.Path.To.File.FileName_ 例如:_ConsoleApp1.Stuff.File1.xml_ (3认同)

Tho*_*app 61

我发现最简单的方法是使用Properties.ResourcesFile.这是我用的代码......

对于二进制文件: File.WriteAllBytes(fileName, Properties.Resources.file);

对于文本文件: File.WriteAllText(fileName, Properties.Resources.file);

  • 很简单.这应该是公认的答案. (7认同)
  • 这不是一个完美的答案,因为它不能为可能正在研究此问题的新手解释项目资源的来源。首先在这里>> /sf/answers/6348961/然后使用此答案 (4认同)
  • 需要您首先创建资源文件...在将文件放入其中等方面可能会很有用。 (2认同)

小智 30

我一直在使用这个(测试过的)方法:

OutputDir:要复制资源的位置

ResourceLocation:命名空间(+ dirnames)

文件:要复制的资源位置中的文件列表.

    private static void ExtractEmbeddedResource(string outputDir, string resourceLocation, List<string> files)
    {
        foreach (string file in files)
        {
            using (System.IO.Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceLocation + @"." + file))
            {
                using (System.IO.FileStream fileStream = new System.IO.FileStream(System.IO.Path.Combine(outputDir, file), System.IO.FileMode.Create))
                {
                    for (int i = 0; i < stream.Length; i++)
                    {
                        fileStream.WriteByte((byte)stream.ReadByte());
                    }
                    fileStream.Close();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)