Не вдалося знайти жодних ресурсів, відповідних зазначеній культурі чи нейтральній культурі


194

У мене є два веб-проекти ASP.NET (ProjectA і ProjectB). Коли клас у ProjectA створює екземпляр класу ProjectB, який використовує файл ресурсу Blah.resx, я отримую цю помилку:

Виняток типу "System.Resources.MissingManifestResourceException" стався в mscorlib.dll, але не використовувався в коді користувача.

Не вдалося знайти жодних ресурсів, відповідних зазначеній культурі чи нейтральній культурі. Переконайтесь, що "Resources.Blah.resources" було правильно вбудовано або пов’язано у збірку "App_GlobalResources.sn_flri6" під час компіляції, чи всі супутникові збори потрібні для завантаження та повністю підписані.

Що це спричиняє?

На сайті Майкрософт є стаття про цю http://support.microsoft.com/kb/318603, яка пропонує:

Щоб вирішити цю проблему, перемістіть усі інші визначення класів так, щоб вони з'явилися після визначення класу форми.

Це рішення для проекту Windows Forms, я не впевнений, чи це стосується і веб-проектів.


Що це за проекти? 2 веб-сайти? 1 веб-сайт, бібліотека 1 класу?
Рудді

Два веб-проекти ASP.NET.
dev.e.loper

11
+1 для цього To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.Це вирішило мою проблему.
ОмарОтман

1
Додайте +1 до свого визначення питань за допомогою посилання Довідка Microsoft Windows Project Forms просто виправила мою проблему.
DarrenMB

Ця відповідь вирішила проблему для мене! GetGlobalResourceObject
DanielV

Відповіді:


257

Я просто потрапив на цей самий виняток у проекті WPF. Проблема виникла в рамках збірки, яку ми нещодавно перенесли в іншу область імен ( ProblemAssembly.Supportдо ProblemAssembly.Controls). Виняток стався під час спроби доступу до ресурсів із другого файлу ресурсів, який існує у збірці.

Виявляється, додатковий файл ресурсу неправильно перемістив посилання зі старого імені простору імен до нового імені простору імен.

У дизайнері.cs для файлу ресурсу є статична властивість отримати ResourceManager. Всередині цього геттера рядок все ще посилався на старий простір імен. Виправивши його в новому просторі імен, проблему було вирішено:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

повинно було:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);

Сподіваюся, це допоможе наступній людині.


5
+1 Добре пояснення, де знайти причину у файлі дизайнера. Знайдена та виправлена ​​ця проблема завдяки вам :)
Пройшло кодування

1
посилання: документація MSDN для класу ResourceManager .
Boinst

3
Спасибі це допомогло мені вирішити це питання. Можна також видалити файл дизайнера, потім відкрити, а потім зберегти файл resx для правильного відновлення файлу дизайнера.
Серж

1
У мене було те саме питання, і це була відповідь, яку я шукав. На жаль, вона не з’являється під час компіляції :-( Спасибі
noob

2
спасибі була і ця проблема, але це було тому, що я додав підпапку з тим же ім'ям, що і останню частину простору імен проекту, щоб він шукав project.folder.folder.class замість project.folder.class. Я перемістив його до кореня і тепер він вишикується і працює!
SelAromDotNet

115

Я вирішив проблему так:

  1. Клацніть правою кнопкою миші на файлі ResourceFile
  2. Змініть властивість "Зробити дію" Компілюйте на "Вбудований ресурс"
  3. Потім будуйте і запускайте

Це прекрасно працює.


@sibi Elango Я клацну правою кнопкою миші на своєму ResourceFile, але не можу знайти частину Build Action.
S5498658

1
@ S5498658 Якщо ви цього не бачите в контекстному меню (клацніть правою кнопкою миші), загляньте на панель "Властивості" (як правило, розташована нижче програми провідника).
визначається

Його збірка дій, але все ще не працює. Також я перевірив, що каталог і те саме в властивості.
альбатрос

1
Було б чудово, якщо відповідь пояснить, чому це рішення працює.
Луїс Тейон

це просто приголомшливо
code4j

22

Коли я спробував поділитися файлом resource.resx з одного проекту C # з іншим проектом C #, у мене виникла ця проблема. Пропозиція щодо переміщення класу Form на початок свого файлу виявилася невідповідною. Ось як я це вирішив. Ви по суті використовуєте посилання від другого проекту до першого, а потім включаєте регенерацію resource.designer.csфайлу.

  1. Видаліть другий проект Properties/Resources.resx файл
  2. Додайте Properties/Resources.resxфайл першого проекту як ПОСИЛАННЯ до папки Властивості у другому проекті. Не додайте його до кореневого рівня проекту.
  3. Не додайте перший проектProperties/Resources.designer.cs !
  4. Про властивості другого проекту Resources.resxдодайтеResXFileCodeGenerator як CustomTool
  5. Клацніть правою кнопкою миші Resources.resxта виберіть "Запустити спеціальний інструмент". Це створить новий файл дизайнера.cs.

Примітка. Я б уникав редагувати файл resource.designer.cs, оскільки це автоматично генерується.


12

У моєму випадку серія погано продуманих глобальних замін тексту ненароком змінила цей рядок у файлі CS-дизайнера ресурсу.

введіть тут опис зображення

Оскільки простір імен у цьому аргументі більше не збігався з простором імен класу, програма заплуталася під час виконання.

Переконайтеся, що простір імен дизайнера відповідає аргументу рядків у цьому рядку.


1
була саме моя проблема. Дякую, що поділились!
AcidJunkie

Те саме: це відбулося після переходу з PCL до .NET Standard, коли я створив тимчасовий проект та простір імен, в який я скопіював усі переносні файли, видалив портативний проект та повернув простір імен до оригіналу, цей рядок все ще містив тимчасовий простір імен з міграційного процесу.
Зерга

11

Це відбувається тому, що *.resхвиключається з міграції.

  • Клацніть правою кнопкою миші на файлі ResourceFile
  • Клацніть на пункт меню "Включити у проект"

2
Це зафіксувало це для мене. Зазвичай файл resx додається автоматично. Я зробив злиття, де мені довелося змінити файл проекту та додати міграцію вручну, тож, можливо, це було з цим пов’язане
smarty

Працювали для мене. Я повинен додати всі * .resx файли кожної міграції. Дякую
m.rufca

7

Я виявив, що видаляючи файл дизайнер.cs, виключаючи файл resx з проекту та повторне включення, він часто виправляв подібні проблеми, після рефакторингу простору імен (відповідно до відповіді CFinck)


Це те, що зробило це для мене! (спробував відповідь CFinck, як здавалося актуальним, але це не спрацювало)
winwaed

Дійсно одне з найшвидших рішень
Лоренц Ло Зауер

6

Здається, ніхто не згадував про це рішення. Очевидно насправді - але на мить сполохав мене ...

Модифікатором доступу для нового файлу ресурсів за замовчуванням є Internal(або Friendу VB.Net.) Переконайтеся, що ви змінили це наPublic

(у дизайнера resx є спадне меню вгорі для модифікатора доступу)


4

Сама відповідь Сібі Елангос для мене була недостатньою, тому мені довелося

  • Клацніть правою кнопкою миші на файлі ResourceFile
  • Змініть властивість "Зробити дію"
  • Компілювати до "Вбудованого ресурсу"
  • Побудувати та розгорнути

Це створить App_GlobalResources у вашій /binпапці, тепер скопіюйте цю папку також у корінь веб-програми


4

У моєму випадку проблема, викликана неправильним визначенням класу:

namespace MyBuggyWorld
{
    public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
    {
        public TcpClient ActiveClient { get; set; }
        public BackgroundWorker ActiveWorker { get; set; }
    }
    public partial class FormMain : Form
    {
    }
}

Після перерозподілу BackendObjectдо кінця (краще відокремити файл), виконавши проект чистим + відновити вирішено проблему.


1
Нічого собі, я не усвідомлював, що неправильний клас на початку файлу настільки погано порушить справи.
BrainStorm.exe

4

Я вирішив це, перейшовши до проекту, де був збережений мій файл ресурсів, прокрутившись до його ItemGroup та додавши логічне ім’я, яке відповідало шляху, який очікував компілятор.

Мій EmbeddedResource виглядав так:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

Зараз це виглядає приблизно так

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

3

Що стосується цього випадку, перевірте, чи збірка, що містить ресурси, має простір імен за замовчуванням, встановлений у тому самому тексті (Project-> Properties-> Простір імен за замовчуванням; у VS) Перевірте також, чи у файлі resx для властивості BuildAction встановлено значення "Embedded ресурс "Насолоджуйтесь ...;)


1
Привіт, ти маєш на увазі, що текст у просторі імен (xxx) текст повинен бути таким самим, як у коді: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV

2

Одним із підходів було б включити спільні класи / ресурси в окремий проект бібліотеки класів та направити їх на обидва веб-сайти.


2
Звичайно, це та сама проблема, чи не так?
Бретт Рігбі

2

Дякую @CFinck! Просто, щоб додати підказку іншим: я змінив рядок ResourceManager таким чином:

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

Я перебуваю на vb.net, але, думаю, у C # єдиною різницею буде + замість & об'єднати рядки.

Таким чином я можу використовувати однакові пов'язані файли складання у двох подібних проектах, які діляться ресурсами.


1

Ця помилка також виникає завдяки Dotfuscation, оскільки файл дизайнера resx покладається на відображення. Якщо ви використовуєте Dotfuscator, він порушить ваші файли resx. Ви завжди повинні додавати їх як виключення з процесу обтурації.


1

Коли ми використовували

HttpContext.GetGlobalResourceObject()

Це призведе до помилки, якщо ми не загорнемо цей виклик всередині оператора спробувати.


1

У мене є додаток WinForms з одним проектом у рішенні.
Націлювання на .NET Framework 4.0
використання SharpDevelop 4.3в якості моєї IDE

Звучить нерозумно, але у мене в файлі трапилося Logical Nameвластивість . Після того, як я очистив цю власність, все працює з усією справою."Resources""Resources.resx"

Як правило, коли ви додаєте випадкові файли як EmbeddedResource, ви, як правило, хочете встановити Logical Nameщось розумне, чомусь я зробив те саме у Resources.resxфайлі, і це все накрутив ...

Сподіваюся, що це комусь допоможе.


У мене, здавалося, це теж було. Гадаю, конфлікт, я думаю, хороша знахідка!
Трент

1

Для мене проблемою було копіювання файлів .resx та пов'язаних з ними .cs-файлів з одного проекту в інший. Обидва проекти мали однаковий простір імен, так що це не було проблемою.

Нарешті вирішив це, коли я помітив у Solution Explorer, що в оригінальному проекті .resx-файли залежали від файлів .cs:

MyResource.cs
|_ MyResource.resx

Хоча в скопійованому проекті .cs-файли залежали від файлів .resx:

MyResource.resx
|_ MyResource.cs

Виявилося, що у другому проекті якимось чином файли .resx були встановлені для автоматичного генерування файлів .cs. Автоматично створені файли .cs перезаписували файли .cs, скопійовані з оригінального проекту.

Щоб вирішити проблему, відредагуйте властивості кожного .resx-файлу в скопійованому проекті. Призначений для користувача інструмент властивість буде встановлено щось на зразок ResXFileCodeGenerator . Очистіть властивість користувальницького інструменту файлу .resx. Вам потрібно буде скопіювати файл .cs з оригінального проекту, оскільки він буде перезаписаний автоматично створеним файлом.


1

У моєму випадку я розмістив новий клас поверх форми Windows у тому ж файлі.

Виведення проблеми із доданого класу із цього файлу виправлено проблему.

Дивіться тут: http://i.stack.imgur.com/wVu6c.png


1
Ласкаво просимо до Stackoverflow! Якщо у вас є код, який потрібно поділитися з нами, будь ласка, не публікуйте його як зображення. Ви можете додати його до своєї публікації та відформатувати як код .
FelixSFD

Дякую @FelixSFD за пропозицію
Petre

1

Це може бути викликано невідповідними просторами імен. Другий з верхньої відповіді (Сібі Еланго) говорить, що клацніть правою кнопкою миші файл resx та змініть параметр Build на EmbeddedResource, але я вже це зробив і все-таки помилка. У верхній відповіді (CFinck's) відзначається спосіб виправити це за допомогою редагування файлів вручну, однак у мене була проблема в MonoDevelop, і мені довелося встановити простір імен за замовчуванням таким самим, як файл CS, який викликав ресурс (файл, який міститься такий код, як код нижче) ...

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

Після встановлення простору імен за замовчуванням через графічний інтерфейс, рядок вище не викликав винятку.


1

Просто інший випадок. Я скопіював рішення з двома проектами і частково перейменував їх у Провідник Windows (назви папок, назви файлів .sln та .csproj), а частково - з масовою дією Find & Replace у Visual Studio (простори імен тощо). Проте виняток, заявлений ОП, все ж стався. Я дізнався, що назви Асамблеї та простору імен ще були старими.

Хоча проект і все інше вже були названі OfficeStyleAssembly name і Default namespaceще назвали Linckus .

Стара ситуація

Після цього виправлення все знову працювало нормально, компілюйте та запускайте час :)

Нова ситуація


0

У моєму випадку ці рядки коду додали, що Web.configдопомогло чимало:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

Разом з Побудова дії: Embedded Resourceі призначений для користувача інструмент: PublicResXFileCodeGenerator.


0

Властивості подвійного клацання в розділі програми перевірте ім'я складання та простір імен за замовчуванням однакові


0

Я також зіткнувся з тим же питанням, спробував усі рішення, згадані у відповіді, але жодне, здавалося, не спрацювало. Виявилося, що під час реєстрації коду до TFS. TFS не перевірив файл Resx, він лише перевірив у файлі дизайнера. Тому всі інші розробники стикалися з цим питанням під час роботи на своїх машинах. Перевірка файлу resx вручну зробила трюк


Що ви маєте на увазі під "реєстрацією"?
Фанданго68

Натискання файлу на TFS
Kayani

0

Це також може статися, коли кладемо клас над основним класом winform (наприклад, Form1). Це можна побачити, дивлячись на конструкцію, оскільки вона не може бути надана.


0

Ще одна причина: якщо у вашому просторі імен є дефіс ("-"), він буде побудований і запускається правильно, але ресурс не буде доступним. У просторах імен (ідентифікаторів) не повинно бути дефісів, але це, здається, не застосовується ніде, крім завантаження ресурсів. Це спалювало мене двічі за десятиліття.


0

Інша річ, щоб перевірити, чи є у вас вбудовані LogicalName або ManifestResourceName в EmbeddedResource. Переконайтеся, що вони визначені належним чином, якщо ваш проект проекту використовує їх, оскільки вони можуть спричинити, що ресурси живуть під іменем, якого ви не очікуєте.


0

Я зіткнувся з цим питанням для запуску команди Migration. Update-Databaseв консолі диспетчера пакунків.

Прийнята відповідь не вирішила моєї проблеми.

Мені довелося змінити Build Action з Compileна, Embedded Resourceі це працювало на мене.

Ви можете зробити те ж саме, виконавши наведені нижче дії.

  1. Клацніть правою кнопкою миші на міграції.
  2. Змініть властивість "Зробити дію" "Компілювати" на "Вбудований ресурс"
  3. Запустіть команду Update-Database.

0

Для користувачів, які стикаються з цією проблемою в .NET Core 3.0, це може бути пов’язано з переломною зміною, яка була внесена в .NET Core 3.0, щоб вирішити її просто встановленою EmbeddedResourceUseDependentUponConventionна помилку в проекті csproj:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>

0

Клацніть правою кнопкою миші на ресурсах і виберіть Run Custom Tool

Це виправить дизайнер


-1

Тільки тому, що ви посилаєтесь на DLL проекту B, не означає, що менеджер ресурсів проекту A знає каталог App_GlobalResources проекту B.

Ви використовуєте проекти веб-сайтів або проекти веб-додатків? В останньому Visual Studio має дозволити пов'язувати файли вихідного коду (не впевнений у першому, я ніколи їх не використовував). Це маловідома, але корисна функція, яка описана тут . Таким чином, ви можете зв'язати файли ресурсів Project B в Project A.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.