Перебор строковых ресурсов в другой сборке

1

Я хотел бы выполнить итерацию по всем строковым ресурсам в данной сборке.NET. Для этого я придумал следующий код:

public void IterateResourcesInAssembly(string filename)
{
  var assembly = Assembly.LoadFile(filename);
  string[] resourceNames = assembly.GetManifestResourceNames();

  foreach (var resourceName in resourceNames)
  {
    var resourceManager = new ResourceManager(resourceName, assembly);
    var resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);
    // Exception is thrown!
  }
}

Проблема здесь в том, что GetResourceSet всегда выдает исключение:

Отсутствие ManifestResourceException Для данной культуры или нейтральной культуры ресурсы не найдены...

Но я уверен, что это неправда. Сборка содержит множество ресурсов на английском и немецком языках. При открытии сборки с помощью.NET-Reflector я тоже вижу эти ресурсы.

  • 0
    Вы пытались использовать метод InternalGetResourceSet. Я смутно помню, как использовал этот метод вместо того, чтобы делать то же самое. Видеть. msdn.microsoft.com/en-us/library/… . Вы также можете попробовать сначала вызвать GetNeutralResourcesLanguage, чтобы получить CultureInfo, который вам нужно передать.
Теги:
.net-assembly
embedded-resource

1 ответ

3
Лучший ответ

Метод GetManifestResourceNames() возвращает имя ресурса с расширением. Перед созданием экземпляра диспетчера ресурсов вам необходимо удалить расширение из имени ресурса и передать только базовое имя ресурса.

public void IterateResourcesInAssembly(string filename)
        {
            var assembly = Assembly.LoadFile(filename);
            string[] resourceNames = assembly.GetManifestResourceNames();

            foreach (var resourceName in resourceNames)
            {
                string baseName = Path.GetFileNameWithoutExtension(resourceName);
                ResourceManager resourceManager = new ResourceManager(baseName, assembly);

                var resourceSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true);
                // Exception is thrown!
            }
        }
  • 0
    Это работает довольно хорошо. Но у него есть одна проблема: независимо от того, какую культуру я передаю GetResourceSet, я всегда получаю ресурсы по умолчанию (на английском языке). Как это можно исправить, чтобы, например, 'new CultureInfo ("de") "достал мне локализованные немецкие ресурсы?
  • 0
    Это связано с тем, что после введения локализованных ресурсов будет создана отдельная сателлитная сборка для хранения локализованной версии. Например, если у вас есть немецкий локализованный файл, в папке bin будет создана отдельная папка «de-DE», в которой будет находиться сателлитная сборка. Я предполагаю, что вы загружаете основную DLL, которая не имеет локализованных ресурсов. Следующая ссылка содержит пример того, как динамически построить путь сборки. stackoverflow.com/questions/5246584/...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню