Я получаю странное исключение MissingManifestResourceException

У меня есть решение с несколькими проектами, основным проектом, проектом глобализации и тестовым проектом.

Когда код в основном проекте извлекает сообщение из файла Messages.de.resx проекта глобализации, все работает нормально.

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

System.Resources.MissingManifestResourceException ist aufgetreten.
Message=Für die angegebene Kultur oder dieneule Kultur konnten keine Ressourcen gefunden werden. Stellen Sie sicher, dass EGR_IQone_Globalization.Messages.resources beim Kompilieren Richtig in die Assembly EGR_IQone_Globalization eingebette wurde, oder dass die erforderlichen Satellitenassemblys geladen werden werden und vollständig signiert sind. Source=mscorlib StackTrace: из System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) из System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo культура, Dictionary`2 localResourceSets, логические tryParents, логические createIfNotExists, StackCrawlMark& stackMark) из System.Resources.Resources.Resources. InternalGetResourceSet (CultureInfo запрашиваемая культура, логическое значение createIfNotExists, логическое значение tryParents, StackCrawlMark и stackMark) из System.Resources.ResourceManager.InternalGetResourceSet (культураCultureInfo, логическое значение createIfNotExists, логическое значение tryParents) из System.Resources.ResourceManager.GetString (имя строки, культура и региональные параметры) из System. Resources.ResourceManager.GetString(имя строки) в EGR_IQone_Globalization.UserMessage.GetMessage(String msgID, String[] аргументы) в C:\projects\EGR_IQoneH\EGR_IQone\EGR_IQone_Globalization\UserMessage.cs:Zeile 28. Внутреннее исключение:

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

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

Это код:

 public static class UserMessage
    {
        private static ResourceManager _resourceManager;

        static UserMessage()
        {
            string baseName = Assembly.GetAssembly(typeof(UserMessage)).GetName().Name + ".Messages.de";
            Console.WriteLine(baseName);
            _resourceManager = new ResourceManager(baseName, Properties.GlobalizationAssembly);
        }

        public static string GetMessage(string msgID, params string[] arguments)
        {
            string msg = "";
            string error = "[Message Error] cannot read Message " + msgID;
            try
            {
                //DefaultLanguage = 'de'
                //using the GetString overload with or without CultureInfo paramter makes no difference
                msg = _resourceManager.GetString(msgID, new CultureInfo(Properties.DefaultLanguage));

                for (int i = 0; i < arguments.Length; i++)
                {
                    msg = msg.Replace("{" + i.ToString() + "}", arguments[i]);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(error + "\r\n" + ex.ToString());
                return error;
            }
            return msg;
        }
    }

http://pastebin.com/L0YNxyfK

Спасибо!


person Ishiirou    schedule 13.06.2013    source источник
comment
Это будет проблемой, он находит вспомогательную сборку на основе местоположения EXE. Вы больше не работаете с обычным EXE, теперь ваш код выполняет программа запуска тестов. Довольно сложно исправить, вам лучше протестировать этот сценарий без запуска тестов.   -  person Hans Passant    schedule 13.06.2013
comment
Спасибо. Думаю, тогда я пропущу этот тест, потому что он работает в обычном коде и не стоит времени и усилий. Но хорошо знать, почему это не сработало, чтобы, если что-то подобное повторится, я хотя бы имел представление, где искать проблему.   -  person Ishiirou    schedule 14.06.2013


Ответы (1)


У меня была такая же ошибка - она ​​внезапно возникла, хотя приложение какое-то время работало.

Это помогло установить Thread.CurrentThread.CurrentUICulture перед получением ресурса.

Попробуйте следующее или что-то подобное:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");
msg = _resourceManager.GetString(msgID);
person user2519790    schedule 02.07.2013