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

Невозможно загрузить ресурс манифеста с помощью 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, поэтому я думаю, что ресурс не найден! Но почему?

Спасибо

4b9b3361

Ответ 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 работал должным образом.