Невозможно загрузить ресурс манифеста с помощью GetManifestResourceStream()
Я создал настраиваемый раздел конфигурации с помощью XSD. Чтобы проанализировать конфигурационный файл, следующий за этой новой схемой, я загружаю ресурс (мой .xsd файл) следующим образом:
public partial class MonitoringConfiguration
{
public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd";
public const string ConfigSchema = "urn:MonitoringConfiguration-1.0";
private static XmlSchemaSet xmlSchemaSet;
static MonitoringConfiguration()
{
xmlSchemaSet = new XmlSchemaSet();
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
XmlReader schemaReader = XmlReader.Create(xsdStream);
xmlSchemaSet.Add(ConfigSchema, schemaReader);
}
}
Кстати, мой ресурс: MonitoringConfiguration.xsd. И пространство имен другого частичного класса (представляющего код позади файла .xsd) равно MonitoringAPI.Configuration
.
Проблема находится здесь:
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
xsdStream имеет значение null, поэтому я думаю, что ресурс не найден! Но почему?
Спасибо
Ответы
Ответ 1
Имя ресурса всегда:
<Base namespace>.<RelativePathInProject>.<FileName>
Итак, если ваш ресурс находится в разделе "Ресурсы/Xsd/", а ваше пространство имен по умолчанию - "MonitoringAPI.Configuration", имя ресурса:
"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"
Также убедитесь, что для действия сборки для вашего ресурса установлено значение "Встроенный ресурс"
Ответ 2
Простой и правильный способ получить фактическое имя встроенного ресурса:
string[] resourceNames =
Assembly.GetExecutingAssembly().GetManifestResourceNames();
Затем просто проверьте массив resourceNames, и вы точно знаете, что передать методу GetManifestResourceStream.
Ответ 3
По умолчанию visual studio не вставляет файл xsd, поэтому вы должны убедиться, что свойство "Build Action" для файла xsd установлено в "Embedded Resource", чтобы заставить его работать
Ответ 4
В моем случае
При попытке доступа к файлу через GetManifestResourceStream()
. Вы получите сообщение об ошибке из-за неправильного пути к файлу, и поток будет пустым.
Решение:
Щелкните правой кнопкой мыши файл, который вы добавили в решение, и нажмите "Свойства".
Выберите Build Action
как Embedded Resource
. (Вместо Content
- по умолчанию)
![Создать свойство действия, установленное для внедренного ресурса]()
Ответ 5
просто добавьте свои ресурсы в form1.resx → добавьте существующие элементы
дважды щелкните по ресурсам, которые вы добавили в разделе Ресурсы folder.go, в свойствах и выберите "Встроенные ресурсы" вместо них.
Тогда
попробуйте отладить строку:
string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();
проверьте добавленные ресурсы в массиве. затем скопируйте имя ресурса точно из этого массива и попробуйте поместить его в свой код.. он отлично работает!!
Ответ 6
Вы можете получить поток ресурсов, передав имена ресурсов, следующие ниже:
-
Получить имя ресурса, например.
Сборка objAssembly = Assembly.GetExecutingAssembly();
string [] strResourceNames = objAssembly.GetManifestResourceNames();
-
Передайте имена ресурсов в...
Поток strm = objAssembly.GetManifestResourceStream(strResourceNames);
Теперь у вас есть Stream, вы можете делать все, что хотите...
Ответ 7
В моем случае это было совсем другое:
Приложение My UWP правильно составлено в конфигурации Debug и Release, но GetManifestResourceStream вернул конфигурацию Release только Null.
Проблема заключалась в том, что в файле конфигурации сборки UWP (и только там) была включена настройка "Компиляция с цепочкой инструментов .NET Native" . После отключения GetManifestResourceStream работал должным образом.