Подтвердить что ты не робот

GetManifestResourceStream возвращает NULL

Это приложение С#.NET 4.0:

Я вставляю текстовый файл в качестве ресурса, а затем пытаюсь отобразить его в диалоговом окне:

    var assembly = Assembly.GetExecutingAssembly();
    var resourceName = "MyProj.Help.txt";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                string result = reader.ReadToEnd();
                System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK);
            }
        }

Решением является MyProjSolution, а исполняемым файлом является MyProj.exe. Help.txt - встроенный ресурс. Однако поток имеет значение NULL. Я пробовал MyProjSolution.Help.txt и MyProjSolution.MyProj.Help.txt, но ничего не работает.

4b9b3361

Ответ 1

Вы можете проверить правильность вложения ресурсов с помощью

//From the assembly where this code lives!
this.GetType().Assembly.GetManifestResourceNames()

//or from the entry point to the application - there is a difference!
Assembly.GetExecutingAssembly().GetManifestResourceNames()

при отладке. В нем будут перечислены все (полные имена) всех ресурсов, встроенных в сборку, в которой написан ваш код.

См. Assembly.GetManifestResourceNames() в MSDN.

Просто скопируйте соответствующее имя и используйте это вместо того, что вы определили в переменной "resourceName".

Заметки - имя ресурса чувствительно к регистру, и если вы неправильно ввели файл ресурсов, он не будет отображаться в списке, возвращаемом вызовом GetManifestResourceNames(). Кроме того, убедитесь, что вы читаете ресурс из правильной сборки (если используются несколько сборок) - все это позволяет легко получить ресурсы из текущей исполняемой сборки, а не из ссылочной сборки.

EDIT -.NET Core
Подробнее о встраивании с помощью .NET Core см. В SO post.

Получение информации о манифестах выглядит аналогичной - просто используйте this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames(), чтобы получить манифест из сборки, где выполняется код.

Я еще не понял, как сделать эквивалент Assembly.GetExecutingAssembly() в .NET Core! если кто знает - сообщите мне, и я обновлю этот ответ.

Ответ 2

Сначала у меня была аналогичная проверка проблемы, когда файл включен в ваш проект, затем перейдите к свойствам и установите действие сборки этого файла в Embedded Resource. это сработало для меня.

Ответ 3

Вот причина моего нулевого значения.

http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/

Метод GetManifestResourceStream всегда будет возвращать NULL, если свойство ресурса "встроенное действие" не установлено в "встроенный ресурс"

После установки этого свойства со всеми необходимыми файлами assembly.GetManifestResourceStream начинает возвращать поток corrent вместо NULL

Ответ 4

Просто предупреждение.

Я не мог получить доступ к моему файлу в качестве встроенного ресурса, хотя я указал, что он был, и даже несмотря на то, что у него было свойство Build Action. Потратил много времени, ударяя головой. Я вложил файл кода csharp с .txt, добавленным к его имени (xxx.cs.txt). По каким-то причинам методы GetManifestResourceNames() и GetManifestResourceStream() не будут видеть файл с именем .cs в его имени.

Я переименовал его просто в xxx.txt, и все было в порядке.

Weird.

Ответ 5

Свойство встроенного файла должно быть установлено как "Встроенный ресурс" для правильного выполнения строки, приведенной ниже:

Stream stream = assembly.GetManifestResourceStream(resourceName)

Щелкните правой кнопкой мыши файл, выберите свойство, а затем установите для свойства "Построить действие" значение "Встроенный ресурс":

enter image description here

Ответ 6

У меня была та же проблема, благодаря Jay, я обнаружил, что в имени каталога были дефисы.

ProjectName.ResourceFolder.Sub-Directory становится ProjectName.ResourceFolder.Sub_Directory, когда вы ссылаетесь на поток ресурсов.

Ответ 7

В моем случае проблема заключалась в том, что код, ищущий ресурс, находился в другом проекте, который сам ресурс.

Вы можете получить доступ только к ресурсам, находящимся в том же проекте, что и код. Я думал, что могу разместить все свои ресурсы в проекте веб-страницы, но мне нужны изображения в почтовом проекте.

Надеюсь, это поможет кому-то в той же ситуации, в которой я был.

Я нахожу действительно полезным вызов Assembly.GetExecutingAssembly().GetManifestResourceNames();.

Ответ 8

    First Unload the project and click on edit the project file. 

    Inside the project file make sure that the item you are fetching from the assembly is included inside <EmbeddedResource> tag.

    Eg: 

         <ItemGroup>
          <EmbeddedResource Include="Template\ForExampleFile.html" />
         </ItemGroup>


    The files I added into the project were just in Content tag but not in the EmbeddedResource as shown below by default. Hence the stream was returning null.
    <ItemGroup>
        <Content Include="Template\ForExampleFile.html" />
  </ItemGroup>

Ответ 9

Вам необходимо выгрузить свое решение. Затем отредактируйте проект. После этого найдите папку и измените ее следующим образом:

<EmbeddedResource Include="yourpath" />

Ответ 10

Вероятно, вам нужно указать путь к вашему txt файлу в параметре GetManifestResourceStream, или вы можете попробовать вставить файл txt в том же каталоге, что и ваш исполняемый файл. Надеюсь, что это поможет!