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

Ситуация:

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

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

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

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

 maxkoryukov30 июн. 2016 г., 00:22
Извините, но это способ Microsoft:удалить все, а затем добавить снова, Работает на ресурсы, NUGET, ссылки и строки подключения. Инструментов много, но в нестандартных случаях вы потратите время на необработанные файлы ...
 rr-08 сент. 2015 г., 11:35
Это одно из самых бесполезных исключений в .NET. Он запускается как минимум в 3 сценариях, которые не имеют ничего общего.

Ответы на вопрос(17)

в моем случае я сделал несколько вещей:

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

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

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

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

Решение Вопроса

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

 ashes99929 сент. 2011 г., 22:54
Что делать, если вы неу вас есть файл resources.resx?
 digitguy22 сент. 2014 г., 06:59
Спасибо! Спас мой день.
 Stimul8d16 сент. 2010 г., 14:50
Я люблю тебя. :-)
 Eric06 мая 2010 г., 12:34
Это сэкономило мне много времени!
 wingskush17 июн. 2015 г., 11:44
Большое спасибо ... Я был в сети в поисках решения. Я перепробовал много решений, но вы спасли мой день ... большое спасибо
 Kavitha18 дек. 2012 г., 06:57
Я запустил ту же проблему. Файл .resx был добавлен в проект вручную, свойство Custom Tool для файла, который я установил для "ResXFileCodeGenerator»Файл .then resx является первым, а позже файл designer.vb позже. Файл desinger является первым и более поздним файлом .resx. как я могу сделать это ....
 ScampDoodle28 февр. 2013 г., 17:41
Очень полезно на самом деле.
 TrueWill12 окт. 2010 г., 23:17
+1! В VS 2010 литеральная строка ResourceManager, показанная выше, автоматически обновляется до значения пространства имен по умолчанию в свойствах проекта (вкладка «Приложение»), по крайней мере, для WinForms.
 user168398707 нояб. 2014 г., 22:14
Спасибо! Мне также пришлось удалить Resources.Designer.vb, а затем запустить пользовательский инструмент! Еще раз спасибо!
 Abe Miessler21 мая 2014 г., 03:42
я работаю в Visual Studio 2013 и нетт а "Run Custom Tool " когда я щелкну правой кнопкой мыши. Любые предложения о том, где этот парень может скрываться?
 RenniePet07 авг. 2012 г., 23:41
@ ashes999: Вы смотрели в папке «Свойства»? Тот'где это обычно для проектов C # по крайней мере.
 Woozar15 мая 2018 г., 13:30
Большое спасибо - я не уверен, что нашел это сам.
 wingskush17 июн. 2015 г., 11:46
@AbeMiessler ну да .. ты идешь в свойства и там в тебе; увидим CustomTool вставить "ResXFileCodeGenerator» и щелкните правой кнопкой мыши файл в обозревателе решений и запустите пользовательский инструмент. Я уверен, что вы уже поняли это, но для дальнейшего обращения к любому нуждающемуся :)

как перенес свой проект с VS2005 на VS2010. Я не'В файле, содержащем мой класс Form, не должно быть никаких других классов. И у меня также было правильно установлено имя файла Resx Resx. Didn»т работа.

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

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

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

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

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

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

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

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

 Gary Huckabone04 янв. 2018 г., 21:30
Та же проблема; больше ничего не работало, поэтому я просто удалил строку: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ This.Icon»))); 'потому что я нене заботиться о иконке в этой конкретной форме :)
 Sertan Pekel03 мая 2018 г., 13:34
Тот'С ответом. Спасибо.
 niklon11 нояб. 2013 г., 19:36
Это сработало для меня, спасибо!
 Matt Smith25 июл. 2012 г., 18:56
Я получил ошибку из-за добавления класса над формойкласс s в файле Form1.cs (как обсуждалось вРазрешение" раздел ссылки, которую вы предоставили). Спасибо!
 Ma Dude21 окт. 2018 г., 04:23
Если кто-то запутался, у меня был класс под названием "StringExtensions» до "Form1" бит Form1.cs, я переместил его ниже Form1 в form1.cs вместо выше, и это сработалоI '
 Timwi05 сент. 2009 г., 16:02
Спасибо за Ваш ответ. Похоже, у вас была другая проблема, вызвавшая тот же симптом. Я не'в моем коде нет никаких дополнительных классов, на самом деле я неу них вообще нет никаких форм. Я должен отредактировать свой предыдущий ответ, потому что я обнаружил, что я неНа самом деле нужно изменить автоматически сгенерированный код. Я мог бы просто перезапустить генератор кода, и он бы исправился. Понятия не имею, почему процесс сборки несделать это автоматически.

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

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

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

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

Первое случайное исключение типа 'System.Resources.MissingManifestResourceException.

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

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

 Jamleck27 апр. 2016 г., 12:01
Спасибо. Это исправило это для меня.
 Andrew Hanlon29 нояб. 2015 г., 20:30
Спасибо тебе за это! Именно то исправление, которое мне было нужно! Происходит, когда вы случайно создаете проект ViewModel в виде библиотеки элементов управления.

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

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

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

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

 RenniePet18 мар. 2011 г., 14:07
Спасибо за публикацию этогоответ", Несмотря на этоне по теме" относительно ОП 'Проблема в том, что было бы неплохо опубликовать это здесь. Поиск MissingManifestResourceException привел меня к этой теме, и ваш ответ был точным для моей проблемы.
 Smashery22 мар. 2012 г., 23:14
То же самое - спасибо, что нашли время опубликовать это здесь!

и я создаю пакет 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">
    </file></file></files>
</package>

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

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».»

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

Построить действие:Встроенный ресурсСкопировать в выходной каталог:Не копируйПользовательский инструмент:ResXFileCodeGeneratorПространство имен пользовательских инструментов:My.Project.S.Proper.Namespace
 ib1130 апр. 2016 г., 06:43
Спасибо чувак! Это спасло меня!

Запустить пользовательский инструмент команда какпредложенный Тимви не помогло в моем случае.

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

В моем случае мне пришлось поменять собственность »Build Action " от "Ресурс" к "Встроенный ресурс ".

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

 S. Baggy04 дек. 2013 г., 13:36
Спасибо! Это сработало для меня, когда у меня были некоторые текстовые файлы, содержащие контент для тестирования или некоторые правила бизнес-картографии. Переход с контента на встроенный ресурс устранил проблему.
 bignermo17 мая 2017 г., 11:19
Это работает как шарм, спасибо BlaM!
 Shan Plourde01 мая 2011 г., 04:31
+1 спасибо, я дважды проверил мои файлы ресурсов, которые также находятся в отдельной библиотеке, на которую ссылаются другие приложения. У меня было Build Action, установленное на Content, и после изменения его на Embedded Resource все работало хорошо. Глупый недосмотр

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

Щелкните правой кнопкой мыши файл ресурсов, один за другим, в случае нескольких файлов.Убедитесь, что собственностьBuild Action " установлен на "Встроенный ресурс ".

Тот'сидеть! :)

 Mosca Pt23 сент. 2016 г., 07:41
Подтверждая это. У меня есть рабочий проект, но мне нужно было поддерживать сборки ресурсов отдельно, поэтому попытался переключиться с "Встроенный ресурс " просто "Ресурс" и в конечном итоге получил MissingResourceManifestException.

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

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

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

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

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

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

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

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

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

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

Что я сделал, чтобы решить проблему, так это установить модификатор доступа на вкладке Project->свойства->Ресурсы из "Внутренний» (доступно только в пределах одной библиотеки классов) для "Открытый» (доступно из другой библиотеки классов)

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

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

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

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

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

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

 Adam Lewis01 июн. 2018 г., 16:04
Поговорим о дерьмовом описании ошибки ... Я добавил вспомогательный класс в основную форму 'CS файл. Никогда бы я не подумал, что сообщение об ошибке будет ссылаться на это. Спасибо!

Ваш ответ на вопрос