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


ситуация:

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

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

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

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

17 130

17 ответов:

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

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

проблема связана с несоответствием пространств имен, которое возникает при изменении "пространства имен по умолчанию" сборки в параметры проекта. (Я изменил его с (ранее)"Servers" (сейчас) "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 требует, чтобы дизайнеры использовали первый класс в файле.

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

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

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

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

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

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

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

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

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

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

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

первое случайное исключение типа - Система.Ресурсы.MissingManifestResourceException'.

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

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

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

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

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

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

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

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

Смотрите также: 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, но ошибка все еще появляется.

обновление: проблема с ресурсами (ВКЛ. XAML), по-видимому, связано с выходными путями и использованием прямых или обратных косых черт, как описано в разделе: почему изменение выходных каталогов проекта вызывает: IOException был необработан "не удается найти ресурс - приложение.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