将嵌入式资源读入字节数组时出错(C#)

时间:2011-06-11 17:30:13

标签: c# .net arrays resources embedded-resource

我有一个名为“Test.exe”的嵌入式资源。我想做以下事情:

  1. 将Test.exe的内容读入字节数组。
  2. 将Test.exe的内容(现在以字节数组形式)写入新位置(C:\ Test.exe)。
  3. 我正在使用以下代码(在此站点上找到) - 但问题是“s”始终返回空值。我使用以下代码如下:byte[] b = ReadResource("Test.exe");

    public static byte[] ReadResource(string resourceName)
    {
        using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
        {
            byte[] buffer = new byte[1024];
            using (MemoryStream ms = new MemoryStream())
            {
                while (true)
                {
                    int read = s.Read(buffer, 0, buffer.Length);
                    if (read <= 0)
                        return ms.ToArray();
                    ms.Write(buffer, 0, read);
                }
            }
        }
    }  
    

    希望有人能找到我遇到的问题。

2 个答案:

答案 0 :(得分:2)

您需要指定资源的全名。例如,如果您的应用程序被称为Foo

byte[] b = ReadResource("Foo.Test.exe");

实际上,最简单的方法是使用Reflector打开程序集并查看嵌入资源的确切名称。应用程序名称和资源名称之间可能存在名称空间。

如果您没有Reflector(是的,它成为付费产品),要查找嵌入资源的名称,您可以使用以下代码:

foreach (var res in Assembly.GetExecutingAssembly().GetManifestResourceNames())
{
    Console.WriteLine(res);
}

获得嵌入资源的确切名称后,将其传递给ReadResource方法。

作为另一种选择,您可以使用ildasm.exe并双击MANIFEST,它会显示所有嵌入资源。

答案 1 :(得分:2)

如果使用'typed'资源,您可以使用一行代码执行此操作。

File.WriteAllBytes("C:\\test1.exe", Resources.TestFile);

添加输入资源:

  • 转到项目属性Resources标签
  • 选择File作为资源类型
  • 将您的可执行文件添加到资源

    enter image description here

  • 现在您可以按Resources.TestFile

  • 引用文件内容