Что означает MissingManifestResourceException и как его исправить?

ситуация:

  • у меня есть библиотека классов, называется RT.Servers, содержащий несколько ресурсов (типа byte[], но я не думаю, что это важно)
  • та же библиотека классов содержит метод, который возвращает один из этих ресурсов
  • у меня есть простая программа (с ссылкой на эту библиотеку), что только один способ

Я MissingManifestResourceException появляется следующее сообщение:

не удалось найти ресурсы соответствующий для определенной культуры или нейтральная культура. Убедиться "Сервера.Ресурсы.ресурсы" неправильно внедренные или связанные в сборка " RT.Серверы " во время компиляции, или, что все вспомогательные сборки требуется являются устойчивыми и полностью подписан.

Я никогда не играл с культурами или с подписанием собрания, поэтому я не знаю, что здесь происходит. Кроме того, это работает в другом проекте, который использует ту же библиотеку. Любой идеи?

17 ответов


все, что мне нужно сделать, чтобы исправить эту проблему, щелкните правой кнопкой мыши Resources.resx файл в обозревателе решений и нажмите Запустить Пользовательский Инструмент. Это повторно генерирует автоматически сгенерированный .

если .файл resx был добавлен в проект вручную, свойство пользовательского инструмента файла должно быть установлено в "ResXFileCodeGenerator".

проблема связана с несоответствием пространств имен, которое возникает при изменении "пространства имен по умолчанию" сборки в параметры проекта. (Я изменил его с (ранее)"Servers" to (сейчас) "RT.Servers".)

в автоматически сгенерированном коде в Resources.Designer.cs есть следующий код:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

символьная строка "Servers.Resources" пришлось заменить на "RT.Servers.Resources". Я сделал это вручную, но запуск пользовательского инструмента сделал бы это так же хорошо.


Я только что столкнулся с этой проблемой сегодня, и я нашел эта страница справки и поддержки Microsoft это действительно помогло обойти проблему.

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

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

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

затем я наткнулся на ссылку выше, которая сказала

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

Я поместил делегатов (которые я бы не рассматривал "определения классов") в нижней части этого файла, вне локального пространства имен, и программа не получила


я столкнулся с аналогичной проблемой, и, хотя я знаю, что это не причина, по которой была ОП, я опубликую ее здесь, чтобы, если кто-то еще столкнется с этой проблемой в будущем, ответ будет доступен.

Если вы добавите класс перед классом конструктора, вы получите MissingManifestResourceException исключение во время выполнения (без ошибки времени компиляции или предупреждения), потому что

Visual Studio требует, чтобы конструкторы использовали первый класс в файле.

Для (немного) больше информацию см. этот пост.


У меня была такая же проблема, но с помощью Запустить Пользовательский Инструмент команда as предложил Timwi не помогло в моем случае.

однако он ведет меня в правильном направлении, потому что я оказался в свойства на .resx файл. Здесь я заметил разницу с другим .resx файл файл, который не вызвал никаких проблем.

в моем случае мне пришлось изменить свойство "Build Action" с "Resource" на " Embedded Ресурс."

мое лучшее предположение по той причине, что у меня было .resx файл в библиотеке, которая использовалась из другого приложения. У моего приложения не было своего .resx файл файл, поэтому он должен был использовать тот из библиотеки , который доступен только тогда, когда он встроен в библиотеку, а не "отдельно".


когда я запускаю аналогичную проблему в Vs 2012, оказалось, что свойство" пространство имен пользовательского инструмента " файла resx было неправильным (в моем случае, на самом деле, оно было unset, поэтому сгенерированный код yeld это исключение во время выполнения). Мой окончательный набор свойств для файла resx был примерно таким:

  • создать действие: Внедренный Ресурс
  • копировать в выходной каталог: не копируйте
  • Пользовательский Инструмент: ResXFileCodeGenerator
  • Пространство Имен Специального Инструмента: мой.Проект.С. Правильным.Пространство имен

я столкнулся с другой причиной этой проблемы, которая не была связана с файлами resx. У меня была библиотека классов, где отличается.cs содержал следующее:

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

сборка не содержит словарей кода, темы или ресурсов WPF. Я избавился от исключения, удалив атрибут ThemeInfo.

Я не получил фактического исключения, только

первый этап обработки исключения типа - Система.Ресурсы.Классических missingmanifestresourceexception'.

Просмотр сведений об исключении, система запрашивала MyAssembly.г.ресурсов

надеюсь, это может помочь кому-то еще.


Не уверен, что это поможет людям, но это сработало для меня:

Итак, проблема заключалась в том, что я получал следующее сообщение:

не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедиться, "мой.Ресурсы.Ресурсы.ресурсы " были правильно встроены или связаны в сборку "X" во время компиляции или что все необходимые вспомогательные сборки загружаются и полностью подписаны"

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

Что я сделал, чтобы исправить проблему, это установить модификатор доступа на вкладке Проект - > свойства - > ресурсы из "внутреннего" (доступного только в той же библиотеке классов) в" общедоступный " (доступный из другой библиотеки классов)

затем запустите и вуаля, больше никаких ошибок для меня...


Смотрите также: MissingManifestResourceException при выполнении тестов после построения с MSBuild (.mresource имеет путь в манифесте)

Я повторяю ответ здесь только для полноты:

появляется добавление LogicalName в файл проекта исправляет его:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

т. е. таким образом, встроенная запись ресурса в файле проекта выглядит следующим образом:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

это подробно описано в: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

обратите внимание, что мы используем .resx-файл, но ошибка по-прежнему возникает.

Update: проблема с ресурсами (ВКЛ. XAML), похоже, связан с выходными путями и использованием прямых или обратных косых черт, как описано в: почему изменение выходных каталогов проекта вызывает: IOException было необработанным " не удается найти ресурс 'app.в XAML'."


решение, данное BlaM, сработало и для меня.

Я пользователь VS 2013. После прохождения многих исправлений, но не повезло, я попробовал это:

  1. щелкните правой кнопкой мыши файл ресурсов, один за другим, в случае нескольких файлов.
  2. убедитесь, что свойство " Build Action "имеет значение"Embedded Resource".

у меня была та же проблема, но в моем случае я помещаю класс в usercontrol, который связан с usercontrol, как это

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

решение было перенести MyUserControlObject до конца класса Usercontrol, как это

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

надеюсь, это поможет


Я получал ошибку MissingManifestResourceException после того, как я портировал свой проект с VS2005 на VS2010. У меня не было других классов, определенных в файле, содержащем мой класс формы. И у меня также было правильно установлено имя файла ресурсов resx. Не получилось.

поэтому я удалил файлы resx и восстановил их. Теперь все хорошо.


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

моя проблема заключалась в том, что когда я удалил главное окно из своего проекта WPF (у него нет главного окна), я забыл удалить StartupUri с App.xaml. Я думаю, это исключение может произойти, если у вас есть ошибка в StartupUri, поэтому в случае если кто-то борется с этим - проверьте StartupUri на App.xaml.


потому что я предварительно компилирую свое веб-приложение (используя функцию публикации VS2012). Я получал ошибку выше. Я пробовал все предложения, но странное изменение "Build Action" на "Content" сделало трюк!


в моем случае у меня есть веб-api с ресурсами, и я создаю пакет nuget из этого. Когда я использую этот nuget в других проектах, я понимаю, что когда я запрашиваю api с ресурсами, я получаю MissingManifestResourceException после небольшого повторного поиска я узнаю, что NuGet packager не упаковывает ресурсы автоматически. Если вы хотите использовать файлы ресурсов, вы должны сделать это вручную. Поэтому вам нужно добавить следующие строки .файл nuspec : (Визит https://github.com/NuGet/Home/issues/1482)

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

но перед добавлением файлов вам необходимо убедиться, какую версию .net вы используете.


недавно наткнулся на этот вопрос, в моем случае я сделал несколько вещей:

  1. убедитесь, что пространства имен согласованы в конструкторе.cs файл файла resx

  2. убедитесь, что пространство имен сборки по умолчанию(щелкните правой кнопкой мыши проект и выберите Свойства) установлено в то же пространство имен, в котором находится файл ресурсов.

Как только я сделал шаг 2, исключение исчезло.


У меня был недавно созданный проект F#. Решением было снять флажок "Использовать стандартные имена ресурсов" в свойствах проекта -> приложение -> ресурсы / указать, как будут управляться ресурсы приложения. Если флажок не установлен, обновите Visual Studio! Я установил 15.6.7. В 15.3.2 этого флажка нет.


С страница поддержки Microsoft:

эта проблема возникает при использовании локализованного ресурса, существующего в вспомогательной сборке, созданной с помощью a .файл ресурсов с неподходящим именем файла. Эта проблема обычно возникает при создании вспомогательной сборки вручную.

чтобы обойти эту проблему, Укажите имя файла .файл ресурсов при выполнении сведения.исполняемый. При указании имени файла .файл ресурсов, убедитесь, что имя файла начинается с имени пространства имен приложения. Например, выполните следующую команду в командной строке Microsoft Visual Studio .NET для создания .файл ресурсов с именем пространства имен приложения в начале имени файла:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources