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

151

Ситуация:

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

Я получаю MissingManifestResourceExceptionсо следующим сообщением:

Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что «Servers.Resources.resources» был правильно встроен или связан со сборкой «RT.Servers» во время компиляции, или что все требуемые сателлитные сборки являются загружаемыми и полностью подписаны.

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

Timwi
источник
2
Это одно из самых бесполезных исключений в .NET. Он запускается как минимум в 3 сценариях, которые не имеют ничего общего.
8-15
1
Извините, но это способ Microsoft: удалите все, а затем добавьте снова . Работает на ресурсы, NUGET, ссылки и строки подключения. Инструментов много, но вы будете тратить время на необработанные файлы в
необычных

Ответы:

238

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

Если файл .resx был добавлен в проект вручную, то для свойства Custom Tool этого файла должно быть установлено значение «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". Я сделал это вручную, но запустив пользовательский инструмент, все равно было бы хорошо.

Timwi
источник
9
Это сэкономило мне много времени!
Эрик
1
+1! В VS 2010 литеральная строка ResourceManager, показанная выше, автоматически обновляется до значения пространства имен по умолчанию в свойствах проекта (вкладка «Приложение»), по крайней мере для WinForms.
TrueWill
2
Что если у вас нет файла resources.resx?
ashes999
@ ashes999: Вы смотрели в папке «Свойства»? Вот где это обычно для проектов C # по крайней мере.
RenniePet
Я запустил ту же проблему. Файл .resx был добавлен в проект вручную, свойство Custom Tool для файла, который я установил как «ResXFileCodeGenerator». Затем файл resx является первым, а затем файл designer.vb позже. Файл desinger сначала и позже .resx файл. Как я могу сделать это ....
Кавита
37

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

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

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

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

Потом я наткнулся на ссылку выше, где

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

Я поместил делегатов (которые я бы не рассматривал как «определения классов») внизу этого файла, вне локального пространства имен, и программа больше не получала MissingManifestResourceException. Какая раздражающая ошибка. Но это кажется более надежным решением, чем изменение автоматически сгенерированного кода :)

Марк Рушаков
источник
Спасибо за Ваш ответ. Похоже, у вас была другая проблема, вызвавшая тот же симптом. У меня не было никаких дополнительных классов в моем коде, на самом деле у меня вообще не было никаких форм. Я должен отредактировать свой предыдущий ответ, потому что обнаружил, что мне не нужно изменять автоматически сгенерированный код. Я мог бы просто перезапустить генератор кода, и он бы исправился. Не знаю, почему процесс сборки не сделал это автоматически.
Тимви
7
Я получил ошибку из-за добавления класса выше класса формы в файле Form1.cs (как обсуждалось в разделе «Решение» предоставленной вами ссылки). Спасибо!
Мэтт Смит
Та же проблема; больше ничего не работало, поэтому я просто удалил строку: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); потому что меня не волнует значок в этой конкретной форме :)
Гари Хакабоне
Это ответ. Спасибо.
Сертан Пекель
Если кто-то запутался, у меня был класс с именем «StringExtensions» до бита «Form1» в Form1.cs, я переместил его ниже Form1 в form1.cs вместо выше, и это сработало
Ма Чувак
31

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

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

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

Для (немного) дополнительной информации см. Этот пост .

Моти
источник
12
Спасибо за публикацию этого «ответа». Несмотря на то, что это «не по теме» относительно проблемы ОП, было бы неплохо опубликовать это здесь. Поиск MissingManifestResourceException привел меня к этой теме, и ваш ответ был точным для моей проблемы.
RenniePet
16

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

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

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

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

Бламу
источник
2
+1 спасибо, я дважды проверил мои файлы ресурсов, которые также находятся в отдельной библиотеке, на которую ссылаются другие приложения. У меня было Build Action, установленное на Content, и после изменения его на Embedded Resource все работало хорошо. Глупый оплошность
Шань Плурд
1
Спасибо! Это сработало для меня, когда у меня было несколько текстовых файлов, содержащих контент для тестирования или некоторые правила бизнес-картографии. Переход с контента на встроенный ресурс устранил проблему.
С. Бэгги
12

Когда я запустил аналогичную проблему, в Vs 2012 оказалось, что свойство «Пространство имен пользовательских инструментов» файла resx было неправильным (в моем случае, на самом деле, оно не было установлено, поэтому сгенерированный код выдает это исключение во время выполнения) , Мой последний набор свойств для файла resx был примерно таким:

  • Действие построения: встроенный ресурс
  • Копировать в выходной каталог: не копировать
  • Пользовательский инструмент: ResXFileCodeGenerator
  • Пространство имен пользовательского инструмента: My.Project.S.Proper.Namespace
Старнуто ди топо
источник
3

Также смотрите: 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 "Невозможно найти ресурс" app.xaml " «.

nietras
источник
Примерно после восьми часов отладки этой проблемы и буквального просмотра каждого github, SO и Google ответа, этот ответ решил мою проблему ... между прочим, моя проблема начала возникать после перехода с .Net 3.5 на 4.7.2.
Невилл
3

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

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

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

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

Первое исключение типа «System.Resources.MissingManifestResourceException».

При просмотре информации об исключении система запрашивала MyAssembly.g.resources

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

большая ступня
источник
2
Спасибо тебе за это! Именно то исправление, которое мне было нужно! Происходит, когда вы случайно создаете проект ViewModel в виде библиотеки элементов управления.
Эндрю Хэнлон
Спасибо. Это исправило это для меня.
Jamleck
2

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

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

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

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

Чтобы устранить проблему, я установил модификатор доступа на вкладке «Проект-> Свойства-> Ресурсы» из «Внутренний» (доступный только в одной библиотеке классов) в «Открытый» (доступный из другой библиотеки классов).

Тогда беги и вуаля, больше нет ошибки для меня ...

codingismylife
источник
2

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

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

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

Это оно! :)

Джитен
источник
Подтверждая это. У меня есть рабочий проект, но мне нужно было поддерживать сборки ресурсов отдельно, поэтому попытался переключиться с «Embedded Resource» на просто «Resource» и в итоге получил исключение MissingResourceManifestException.
Mosca Pt
2

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

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

Решение состояло в том, чтобы переместить в MyUserControlObjectконец класса Usercontrol, как это

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

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

кузнец
источник
Поговорим о дерьмовом описании ошибки ... Я добавил вспомогательный класс в CS-файл основной формы. Никогда бы я не подумал, что сообщение об ошибке будет ссылаться на это. Спасибо!
Адам Льюис
1

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

Поэтому я удалил файлы resx и восстановил их. Все хорошо сейчас.

Winston
источник
1

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

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

Archeg
источник
1

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

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

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

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

штурмовик
источник
1

У меня была эта проблема, когда я добавил еще один класс в файл перед классом, производным от Form. Добавление его после исправленной проблемы.

franckspike
источник
1

Также та же ошибка может возникать, когда вы помещаете новый класс в исходный код класса формы, созданной дизайнером.

Этот новый класс может быть удален и помещен в другой файл CS.

(По крайней мере, в моем случае это была проблема ...)

Иштван Надь
источник
0

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

Markive
источник
0

В моем случае у меня есть веб-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 вы используете.

DCY
источник
0

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

KCT
источник
0

Просто чтобы упомянуть. Если вы используете константу или литерал, убедитесь, что они ссылаются на ресурс формы ProjectName.Resourcesи не содержатResources.resx .

Это может сэкономить вам час или два.

трава
источник
0

Я столкнулся с этой проблемой в управляемом проекте C ++ на основе WinForms после переименования глобального пространства имен (не вручную, а с помощью инструмента Rename VS2017).

Решение простое, но нигде не упоминается.

Вы должны изменить RootNamespaceзапись в vcxproj-файле, чтобы она соответствовала пространству имен C ++.

AntonK
источник
0

В моем случае это была опечатка в Xaml окна, открытого из формы Winforms:

Неправильно: <Image Source="/Resources/WorkGreen.gif"/>

Правильно: <Image Source="../Resources/WorkGreen.gif"/> это может кому-то помочь

tretom
источник
-3

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

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

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

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
TheVillageIdiot
источник
1
Спасибо за ваш ответ, но я не знаю, что такое ResGen.exe, я никогда не использовал его, и, честно говоря, я не хочу его использовать, потому что я не пытаюсь использовать что-то необычное. Конечно, должен быть способ исправить это из Visual Studio? Например, поскольку вы говорите, что ресурс «локализован», как я могу объявить ресурс как нелокализованный? Еще раз спасибо.
Тимви