Не удается загрузить ресурс манифеста с помощью GetManifestResourceStream () - PullRequest
46 голосов
/ 18 июня 2010

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

Спасибо

Ответы [ 8 ]

91 голосов
/ 18 июня 2010

Имя ресурса всегда:

<Base namespace>.<RelativePathInProject>.<FileName>

Так что, если ваш ресурс находится в «Resources / Xsd /», а пространство имен вашего проекта по умолчанию - «MonitoringAPI.Configuration»", имя ресурса:

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

Также убедитесь, что для действия сборки для вашего ресурса установлено значение" Встроенный ресурс "

50 голосов
/ 08 января 2013

Простой и правильный способ получить фактическое имя вашего встроенного ресурса:

string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();

Затем просто проверьте массив resourceNames, и вы точно будете знать, что передать методу GetManifestResourceStream.

12 голосов
/ 19 августа 2015

В моем случае

При попытке доступа к файлу через GetManifestResourceStream(). Вы получите ошибку из-за неверного пути к файлу, и поток будет нулевым.

Решение:

Щелкните правой кнопкой мыши файл, который вы добавили в решение, и выберите Свойства.

Выберите Build Action как Embedded Resource. (Вместо Content - по умолчанию)

Build action property set to embedded resource

8 голосов
/ 20 октября 2010

По умолчанию Visual Studio не встраивает xsd-файл, поэтому необходимо убедиться, что свойство «Build Action» для xsd-файла установлено на «Embedded Resource», чтобы оно работало

5 голосов
/ 04 ноября 2015

просто добавьте свои ресурсы в form1.resx -> добавьте существующие элементы

дважды щелкните по ресурсам, которые вы добавили в папке Resources.go в свойствах, и выберите «Встроенные ресурсы» вместо «Нет».

Затем попробуйте отладить строку:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();

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

1 голос
/ 19 октября 2016

Вы можете получить поток ресурсов, передав имена ресурсов, как показано ниже ...

  1. Получить имя ресурса, например.

    Assembly objAssembly = Assembly.GetExecutingAssembly ();

    string [] strResourceNames = objAssembly.GetManifestResourceNames ();

  2. Передать имена ресурсов в ...

    Поток strm = objAssembly.GetManifestResourceStream (strResourceNames);

Теперь у вас есть Stream, вы можете делать все, что захотите ...

0 голосов
/ 01 февраля 2018

У меня была проблема, когда я встраивал целую кучу файлов .xsd во множество различных сборок;все работало (GetManifestResourceNames возвращал файлы, которые я ожидал увидеть), кроме одного.Тот, который не был назван:

Something.LA.xsd

Я не имел дело с конкретными культурами, и бит .LA в конце имени файла был подобран компилятором, так как этот файл предназначен дляКультура Лос-Анджелеса - имя файла в манифесте обозначалось как Something.xsd (в соответствии с культурой Лос-Анджелеса), поэтому я не смог его найти (это оказалось в спутниковой сборке).Я избежал этой проблемы, переименовав файл - возможно, можно явно указать культуру данного встроенного ресурса.

На самом деле быстрый Google показывает: Как я могу предотвратить настройку культуры файла встроенного ресурсаосновываясь на имени файла

Согласно этому ответу, вы должны заниматься хакерскими делами - так что, возможно, переименование файла не так уж и плохо:)

0 голосов
/ 12 июня 2017

В моем случае это было что-то совершенно другое:

Мое приложение UWP правильно скомпилировано в конфигурации Debug и Release, но GetManifestResourceStream вернул конфигурацию Release только для Null.

Проблема заключалась в том, что в файле конфигурации сборки UWP (и только там) была включена настройка "Компилировать с цепочкой инструментов .NET Native" * . После отключения GetManifestResourceStream работал как положено.

...