Ошибка при чтении встроенного ресурса в байтовый массив (C #) - PullRequest
1 голос
/ 11 июня 2011

У меня есть встроенный ресурс с именем «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);
            }
        }
    }
}  

Надеюсь, кто-нибудь найдет то, что мне трудно увидеть.

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Вы можете сделать это с помощью одной строки кода, если используете типизированные ресурсы.

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

Чтобы добавить типизированный ресурс:

  • перейдите на вкладку свойств проекта * вкладка 1007 *
  • выберите File в качестве типа ресурса
  • добавьте свой исполняемый файл к ресурсам

    enter image description here

  • теперь вы можете ссылаться на содержимое файла по Resources.TestFile

2 голосов
/ 11 июня 2011

Вам необходимо указать полное название ресурса.Например, если ваше приложение называется Foo:

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

На самом деле проще всего открыть сборку с помощью Reflector и посмотреть точное имя встроенного ресурса.Между именем приложения и именем ресурса может существовать пространство имен.

И если у вас нет Reflector (да, он стал платным продуктом), чтобы узнать имена встроенныхресурсы, вы можете использовать следующий код:

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

Как только вы получите точное имя встроенного ресурса, передайте его методу ReadResource.

В качестве еще одной альтернативы вы можете использовать ildasm.exe и дважды щелкните MANIFEST, который покажет вам все встроенные ресурсы.

...