找不到适合指定文化或中性文化的任何资源。

17

我创建了一个程序集并将其重命名。

然后我在调用该程序集时开始收到运行时错误:

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 无法解析名称。

10个回答

31
我认为更简单的解决方案是为每种语言创建单独的资源文件。
至于这种情况,请检查包含资源的程序集是否将默认命名空间设置为相同的文本(在VS中,选择“项目”->“属性”->“默认命名空间”)。
还要检查resx文件的BuildAction属性是否设置为“嵌入式资源”。

7
请检查包含资源的程序集是否将默认命名空间设置为相同的文本(在VS中:项目->属性->默认命名空间)。"相同的文本"是指默认命名空间文本与包含资源的程序集的命名空间文本是否相同。 - Captain Comic
6
"+1 for 'Check as well if the resx file has a property BuildAction set to "Embedded resource"' = Facepalm" 的意思是“点赞表达对‘同时检查resx文件是否具有属性BuildAction设置为'嵌入式资源'’的建议十分无语”。 - Andiih

15

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

  1. 您可以通过调用

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

    请确保在调用GetString()方法时,清单名称和您的名称相同。

  2. 此外,请确保在designer.resx文件中使用正确的命名空间:

  3. namespace Jfc.TFSAddIn {
    ...
    global::System.Resources.ResourceManager temp = 
                 new global::System.Resources.ResourceManager(
                 "Jfc.TFSAddIn.CommandBar", typeof(CommandBar).Assembly);
    ... 
    }
    
  4. 打开 resx 文件属性: "Build Action" 应设置为 "嵌入的资源"


1
GetManifestResourceNames()非常有帮助!非常感谢。 - Mystic Lin
哇!!!我一直在挠头为什么它不工作,后来发现我的命名空间使用错误了 System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()。非常感谢! - Sam

14

听起来和我们曾经遇到的问题相似。资源文件设计者中的命名空间是不正确的。我通过手动重新运行自定义工具解决了这个问题。

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


这是我的问题。看起来ReSharper在重构期间重命名了命名空间... - Ian Newson
这里也遇到了同样的问题。将资源移动到另一个项目后,编译后的Designer.cs仍然具有旧的命名空间。运行自定义工具解决了这个问题。谢谢! - Daniel Hillebrand

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

20160216_tranlation.resx

当调用GetGlobalResourceObject时,我需要在resx文件名前添加下划线_

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

0

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

请参考下面的代码:

[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;
        }
    }

我通过向资源中添加一个额外的条目来解决了这个问题。这迫使设计师代码重新构建自身并纠正命名空间问题。 - Phillip Davis

0
我在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>

在重新构建时,还要注意自动生成的类,其中声明的命名空间可能会发生变化。

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


0
在我的Windows表单应用程序中,在部分类之上添加一个类时,出现了这个错误。
当我将该类移动到部分类之下时,错误消失了。

0

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


0
一种解决方案是将resx文件的属性从content更改为嵌入式资源并进行构建。这样做,您就可以得到所需的结果。

-1

这个答案解决了我的问题!GetGlobalResourceObject


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接