【问题标题】:Error While Reading Embedded Resource into byte array (C#)将嵌入式资源读入字节数组时出错(C#)
【发布时间】:2011-06-13 09:54:11
【问题描述】:

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

  1. 将Test.exe的内容读入字节数组。
  2. 将 Test.exe 的内容(现在在字节数组中)写入新位置 (C:\Test.exe)。

我正在使用以下代码(可在此站点上找到) - 但问题是“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);
            }
        }
    }
}  

希望有人能找到我看不到的东西。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 什么是反光板?那是第 3 方应用吗?
    • 您可以使用 ILSpy 作为反射器的免费替代品。
    【解决方案2】:

    如果使用“类型化”资源,您只需一行代码即可完成此操作。

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

    添加类型资源:

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

    • 现在您可以通过Resources.TestFile引用文件内容

    【讨论】:

    • 这是一个很好的回应。谢谢 - 只是出于好奇,如果这个方法如此简单,为什么有人会使用任何其他方法将可执行文件添加为资源?
    • @Evan - 嗯......我猜想让生活变得更加艰难:)
    • @Evan - 所以你选择了艰难的方式? :)
    • 不完全是,但他确实回答了我问的问题:)
    • 很抱歉我没有提供帮助 :(.
    猜你喜欢
    • 2011-10-30
    • 2012-05-11
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多