Это приложение C # .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 - это встроенный ресурс. Однако поток равен нулю. Я пробовал MyProjSolution.Help.txt и MyProjSolution.MyProj.Help.txt, но ничего не работает.
Ответы:
Вы можете проверить правильность внедрения ресурсов, используя
при отладке. В нем будут перечислены все (полные имена) всех ресурсов, встроенных в сборку, в которой написан ваш код.
См. Assembly.GetManifestResourceNames () в MSDN.
Просто скопируйте соответствующее имя и используйте его вместо того, что вы определили в переменной resourceName.
Примечания - имя ресурса чувствительно к регистру, и если вы неправильно встроили файл ресурсов, он не будет отображаться в списке, возвращаемом вызовом GetManifestResourceNames (). Кроме того, убедитесь, что вы читаете ресурс из правильной сборки (если используется несколько сборок) - слишком легко получить ресурсы из текущей выполняющейся сборки, а не из сборки, на которую указывает ссылка.
РЕДАКТИРОВАТЬ - .NET Core. Подробную информацию о встраивании с использованием .NET Core
см. В этой публикации SO .
Получение информации о манифесте выглядит аналогичным - просто используйте,
this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()
чтобы получить манифест из сборки, в которой выполняется код.Я еще не понял, как сделать эквивалент
Assembly.GetExecutingAssembly()
в .NET Core! если кто знает - дайте мне знать, и я обновлю этот ответ.источник
У меня была аналогичная проблема, сначала проверьте, включен ли файл в ваш проект, затем перейдите в свойства и установите действие сборки этого файла на Embedded Resource. это сработало для меня.
источник
DefatultNameSpace.Infrastructure.Help.txt
. Пространство имен по умолчанию на странице свойств вашего проекта иInfrastructure
будет папкой, в которой находится ваш файлСвойство встроенного файла «Build Action» должно быть установлено как «Embedded Resource» для правильного выполнения строки, которая приведена ниже:
Щелкните правой кнопкой мыши файл, выберите свойство и затем установите для свойства «Действие сборки» значение «Встроенный ресурс»:
источник
Вот причина моего нулевого значения.
http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/
GetManifestResourceStream
Метод всегда возвращается ,NULL
если ресурс «Built действия» свойство не установлен на «внедренный ресурс»После установки этого свойства со всеми необходимыми файлами
assembly.GetManifestResourceStream
начинает возвращать правильный поток вместоNULL
.источник
Просто предупреждение.
Я не мог получить доступ к своему файлу как к встроенному ресурсу, хотя я указал, что это так, и даже если у него было это свойство Build Action. Потратил много времени на то, чтобы биться головой. Я встроил файл кода csharp с добавленным к его имени .txt (xxx.cs.txt). По какой-то причине методы GetManifestResourceNames () и GetManifestResourceStream () не увидят файл с .cs в его имени.
Я переименовал его просто в xxx.txt, и все стало нормально.
Странно.
источник
Resource
но нетEmbedded Resource
, что делает его еще более странным ... Удаление.cs.
из имени заставляет его работать. Ага.У меня была такая же проблема, благодаря Джею я обнаружил, что в имени каталога есть дефис.
ProjectName.ResourceFolder.Sub-Directory
становится,ProjectName.ResourceFolder.Sub_Directory
когда вы ссылаетесь на поток ресурсов.источник
В моем случае проблема заключалась в том, что код, ищущий ресурс, находился в другом проекте, чем сам ресурс.
Вы можете получить доступ только к ресурсам, которые находятся в том же проекте, что и код. Я думал, что могу поместить все свои ресурсы в проект веб-страницы, но мне также нужны изображения в почтовом проекте.
Надеюсь, это поможет кому-то в той же ситуации, что и я.
Я считаю действительно полезным призвание
Assembly.GetExecutingAssembly().GetManifestResourceNames();
.источник
Если это помогает кому-то еще, убедитесь, что
Assembly.GetExecutingAssembly()
линия вызывается из той же сборки, в которой есть встроенные ресурсы.источник
Простое и оптимизированное решение - иметь этот базовый класс:
Затем, когда вы добавляете ресурс, вы создаете класс C # для чтения в той же папке:
где класс чтения MyResource.cs очень прост:
Итак, у каждого ресурса будет «теневой» класс, который умеет его правильно читать.
Вот как вы читаете ресурс в своем коде:
И, как предлагали другие ответы, не забудьте установить «Встроенный ресурс» в свойстве Build Action файла ресурсов.
Преимущество этого унифицированного решения:
источник
источник
Вам нужно выгрузить свое решение, затем отредактировать проект, а затем найти свою папку и изменить так:
источник
Хотя OP получил GetManifestResourceStream, возвращающий NULL из ресурсов в той же сборке, в некоторых ответах предполагалось, что, когда ресурсы находятся в другом проекте или сборке, они не могут быть получены, и являются справедливой причиной того, что GetManifestResourceStream возвращает NULL.
Это неправда, по крайней мере, с 2011 года; как я указывал в некоторых комментариях в другом месте, Assembly.LoadFrom () или typeof делают трюк, и в результате вы можете получить доступ к ресурсам, которые находятся в другом проекте.
Для иллюстрации у меня есть умеренно сложный пример; это моя тестовая установка:
Путь к другому проекту:
Захвачено здесь:
А на Form1.cs из WinFormFramework я указываю с помощью
как это:
И результат отображается в текстовом поле:
Я потратил несколько часов, чтобы понять это правильно; для этого мне пришлось использовать много их в Immediate Window:
Надеюсь, это кому-то поможет
источник
Вероятно, вам нужно указать путь к вашему txt-файлу в
GetManifestResourceStream
параметре, или вы можете попробовать вставить txt-файл в тот же каталог, что и ваш исполняемый файл. Надеюсь, это поможет!источник