【问题标题】:Could not find any resources appropriate for the specified culture or the neutral culture找不到适合指定文化或中性文化的任何资源
【发布时间】:2011-06-09 02:37:24
【问题描述】:

我创建了一个程序集,后来重命名了它。

然后我在调用时开始出现运行时错误:

toolsMenuName = resourceManager.GetString(resourceName);

resourceName 变量在运行时为 "enTools"

找不到任何资源 适用于指定的文化 或中立文化。确保 “Jfc.TFSAddIn.CommandBar.resources” 被正确嵌入或链接到 编译时的程序集“Jfc.TFSAddIn” 时间,或者说所有的卫星 所需的程序集是可加载的,并且 完全签名。

代码:

string resourceName;
ResourceManager resourceManager = new ResourceManager("Jfc.TFSAddIn.CommandBar", Assembly.GetExecutingAssembly());

CultureInfo cultureInfo = new CultureInfo(_applicationObject.LocaleID);

if(cultureInfo.TwoLetterISOLanguageName == "zh")
{
     CultureInfo parentCultureInfo = cultureInfo.Parent;
     resourceName = String.Concat(parentCultureInfo.Name, "Tools");
}
else
{
     resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
}

toolsMenuName = resourceManager.GetString(resourceName); // EXCEPTION IS HERE

我可以看到项目中包含的文件 CommandBar.resx,我可以打开它并且可以看到那里的“enTools”字符串。似乎资源未包含在程序集中或资源已包含但 .NET 无法解析名称。

【问题讨论】:

    标签: c# .net exception-handling localization resources


    【解决方案1】:

    我认为更简单的解决方案是为每种语言创建单独的资源文件。

    就本例而言,检查包含资源的程序集是否将默认命名空间设置为相同的文本(项目->属性->默认命名空间;在 VS 中)

    同时检查 resx 文件的 BuildAction 属性是否设置为“嵌入式资源”

    【讨论】:

    • "检查包含资源的程序集的默认命名空间是否设置为相同的文本(项目->属性->默认命名空间;在 VS 中)" - 相同的文本是什么?
    • +1 for '检查 resx 文件是否有一个属性 BuildAction 设置为 "Embedded resource"' = Facepalm
    【解决方案2】:

    听起来与我们遇到的问题相似。资源文件的设计器中的命名空间不正确。我通过在 resx 文件上手动重新运行自定义工具来修复它。

    右键单击 your.resx,然后单击运行自定义工具。

    【讨论】:

    • 这是我的问题。看起来 ReSharper 在重构期间重命名了命名空间...
    • 这里有同样的问题。将资源移动到不同的项目后,编译后的 Designer.cs 仍然具有旧的命名空间。运行自定义工具修复它。谢谢!
    【解决方案3】:

    我相信你已经得到了答案,但以防万一:

    1. 您可以通过调用查看您的 ManifestResourceName

      System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 
      

      检查清单名称和您在 GetString() 调用中的名称是否相同。

    2. 另外,请确保您在 Designer.resx 文件中有正确的命名空间:

      namespace Jfc.TFSAddIn {
      ...
      global::System.Resources.ResourceManager temp = 
                   new global::System.Resources.ResourceManager(
                   "Jfc.TFSAddIn.CommandBar", typeof(CommandBar).Assembly);
      ... 
      }
      
    3. 打开 resx 文件属性:“构建操作”应为“嵌入式资源”

    【讨论】:

    • GetManifestResourceNames() 非常有帮助!非常感谢。
    • 哇!我挠了挠头发为什么它不起作用,我发现我的命名空间使用System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 是错误的。非常感谢!
    【解决方案4】:

    对我来说,问题的根源在于以数字开头的 rex 文件命名:

    20160216_tranlation.resx

    调用GetGlobalResourceObject时,我必须在resx文件名前添加下划线_

    public static string getResource(string key)
    {
        return HttpContext.GetGlobalResourceObject("_20160216_tranlation", key).ToString();
    }
    

    【讨论】:

      【解决方案5】:

      我在 ResourceManager 静态属性中更正了设计器文件 (Resources.Designer.cs) 中的命名空间,它对我有用。

      请看下面的代码:

      [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
          internal static global::System.Resources.ResourceManager ResourceManager {
              get {
                  if (object.ReferenceEquals(resourceMan, null)) {
                      global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("XYZAssembly.Properties.Resources", typeof(Resources).Assembly);
                      resourceMan = temp;
                  }
                  return resourceMan;
              }
          }
      

      【讨论】:

      • 我可以通过在资源中添加一个额外的条目来解决这个问题。这迫使设计器代码重新构建自身并纠正命名空间问题。
      【解决方案6】:

      我在 Form.cs 中添加了一个临时类(测试 || 调试),导致抛出此异常。 Form.resx 文件(名称 || 资源 ID)已修改为临时类名,而不是 Form 类名。这给我带来了问题。我通过在项目中为我的临时类创建一个单独的文件(更正 || 缓解了)这个问题。

      【讨论】:

        【解决方案7】:

        一个解决方案是将resx文件的属性从内容更改为嵌入式资源并构建它。这次肯定是u vil get

        【讨论】:

          【解决方案8】:

          我在 Xamarin.Forms 中遇到过这个问题,当我尝试重命名项目时,无法再加载资源并显示相同的错误文本。

          为了解决这个问题,我不得不通过文本编辑器修改 .csproj,并更改嵌入资源的逻辑名称。

          <EmbeddedResource Include="Localization\TextResources.resx">
                <Generator>ResXFileCodeGenerator</Generator>
                <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
                <LogicalName>YourNewNamespaceName.TextResources.resources</LogicalName>
                <SubType>Designer</SubType>
          </EmbeddedResource>
          

          重建时还要注意自动生成的类,其中所述的命名空间可能会发生变化。

          希望它能帮助遇到同样情况的人。

          【讨论】:

            【解决方案9】:

            当我在我的 Windows 窗体应用程序中添加一个高于部分窗体类的类时出现此错误。

            当我将课程移到部分表单课程下方时,它就消失了。

            【讨论】:

              【解决方案10】:

              answer 为我解决了问题! GetGlobalResourceObject

              【讨论】:

                猜你喜欢
                • 2012-02-14
                • 2012-12-02
                • 1970-01-01
                • 2021-10-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多