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, но ничего не работает.
Ответы
Ответ 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 в том же каталоге, что и ваш исполняемый файл. Надеюсь, что это поможет!