Я хотел бы выполнить итерацию по всем строковым ресурсам в данной сборке.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 я тоже вижу эти ресурсы.
Метод 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!
}
}