【问题标题】:Iterating through string resources in another assembly遍历另一个程序集中的字符串资源
【发布时间】:2014-11-11 09:03:01
【问题描述】:

我想遍历给定 .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 打开程序集时,我也可以看到这些资源。

【问题讨论】:

  • 您是否尝试过使用InternalGetResourceSet方法。我隐约记得使用那种方法来做同样的事情。看。 msdn.microsoft.com/en-us/library/…。您也可以尝试先调用 GetNeutralResourcesLanguage 来获取您需要传入的 CultureInfo。

标签: c# .net .net-assembly embedded-resource


【解决方案1】:

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!
            }
        }

【讨论】:

  • 这很好用。但它有一个问题:无论我将什么文化传递给“GetResourceSet”,我总是得到默认(英文)资源。如何修复,例如'new CultureInfo("de")' 会给我本地化的德国资源吗?
  • 这是因为一旦引入本地化资源,它将创建一个单独的附属程序集来存储本地化版本。例如,如果您有德语本地化文件,则会在包含附属程序集的 bin 文件夹中创建一个单独的文件夹“de-DE”。我假设您正在加载没有本地化资源的主 dll。以下链接包含有关如何动态构建程序集路径的示例。 stackoverflow.com/questions/5246584/…
  • 确实!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多