关于.net:找不到适合指定文化或中性文化的资源

Could not find any resources appropriate for the specified culture or the neutral culture

我有两个ASP.NET Web项目(ProjectA和ProjectB)。当ProjectA中的类正在实例化使用资源文件blah.resx的ProjectB类时,我得到以下错误:

An exception of type 'System.Resources.MissingManifestResourceException' occurred in mscorlib.dll but was not handled in user code.

Could not find any resources appropriate for the specified culture or the neutral culture. Make sure"Resources.Blah.resources" was correctly embedded or linked into assembly"App_GlobalResources.sn_flri6" at compile time, or that all the satellite assemblies required are loadable and fully signed.

是什么造成的?

微软网站上有一篇关于此的文章http://support.microsoft.com/kb/318603,建议:

To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.

这是Windows窗体项目的解决方案,我不确定这是否也适用于Web项目。


我刚刚在一个WPF项目中遇到了同样的异常。这个问题发生在我们最近移动到另一个名称空间(ProblemAssembly.SupportProblemAssembly.Controls的程序集中。尝试从程序集中存在的第二个资源文件访问资源时发生异常。

结果发现附加资源文件没有正确地将引用从旧名称空间名称移动到新名称空间名称。

在资源文件的designer.cs中,有一个静态属性用于获取资源管理器。在这个getter中,字符串仍然引用旧的名称空间。将其更正到新命名空间后,问题就解决了:

1
2
3
global::System.Resources.ResourceManager temp =
     new global::System.Resources.ResourceManager(
         "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

应该是:

1
2
3
global::System.Resources.ResourceManager temp =
     new global::System.Resources.ResourceManager(
         "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);

希望这能帮助下一个人。


我这样解决了这个问题:

  • 右键单击资源文件
  • 将"构建操作"属性compile更改为"嵌入资源"
  • 然后构建并运行
  • 它工作得很好。


    当我尝试与另一个C项目共享来自一个C项目的resource.resx文件时,我遇到了这个问题。将窗体类移到其文件开头的建议不合适。我就是这样解决的。您基本上使用从第二个项目到第一个项目的链接,然后启用resource.designer.cs文件的重新生成。

  • 删除第二个项目的Properties/Resources.resx文件
  • 将第一个项目的Properties/Resources.resx文件作为链接添加到第二个项目的properties文件夹。不要将它添加到项目的根级别。
  • 不要添加第一个项目的Properties/Resources.designer.cs
  • 在第二个项目的Resources.resx的属性上,添加ResXFileCodeGenerator作为自定义工具
  • 右键单击Resources.resx并选择"运行自定义工具"。这将生成一个新的designer.cs文件。
  • 注意:我将避免编辑resource.designer.cs文件,因为这是自动生成的。


    在我的例子中,一系列错误的全局文本替换无意中更改了资源设计器cs文件中的这一行。

    enter image description here

    由于该参数中的名称空间不再与类的名称空间匹配,因此应用程序在运行时会感到困惑。

    检查设计器的命名空间是否与该行中的字符串参数匹配。


    这是因为*.resх被排除在迁移之外。

    • 右键单击资源文件
    • 单击菜单项"包括在项目中"


    我发现,删除designer.cs文件(从项目中排除resx文件,然后重新包含它)通常可以在命名空间重构之后解决此类问题(根据cfinck的答案)。


    似乎没有人提到过这个解决方案。很明显,真的-但是我被绊倒了一下…

    新资源文件的默认访问修饰符是Internal(或vb.net中的Friend)。一定要把这个换成Public

    (在resx设计器中,访问修饰符的顶部有一个下拉列表)


    在我的例子中,错误地定义类所引起的问题是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    namespace MyBuggyWorld
    {
        public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
        {
            public TcpClient ActiveClient { get; set; }
            public BackgroundWorker ActiveWorker { get; set; }
        }
        public partial class FormMain : Form
        {
        }
    }

    重新分配BackendObject到最后(最好是分开文件),进行项目清理+重建解决了这个问题。


    西比·伊兰戈斯一个人的回答对我来说是不够的,所以我不得不

    • 右键单击资源文件
    • 更改"生成操作"属性
    • 编译为"嵌入资源"
    • 生成和部署

    这将在您的/bin文件夹中生成一个app globalresources,现在将该文件夹也复制到Web应用程序的根目录中。


    谢谢@cfinck!只是想给其他人添加一个提示:我用以下命令更改了ResourceManager行:

    1
    New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name &".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

    我在vb.net中,但我认为在c中唯一的区别是+而不是连接字符串。

    这样,我可以在共享资源的两个类似项目中使用相同的链接程序集文件。


    就本例而言,检查包含资源的程序集是否将默认命名空间设置为相同的文本(在vs中为project->properties->default namespace;in vs)检查resx文件是否将属性buildAction设置为"嵌入资源"享受…;)


    我通过转到保存我的资源文件的项目,向下滚动到它的项组,并添加一个与编译器期望的路径对应的逻辑名称来解决这个问题。

    我的嵌入资源如下所示:

    1
    2
    3
    4
    5
    6
       <ItemGroup>
        <EmbeddedResource Update="Properties\TextResources.resx">
          <Generator>PublicResXFileCodeGenerator</Generator>
          <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
        </EmbeddedResource>
      </ItemGroup>

    现在看起来像这样

    1
    2
    3
    4
    5
    6
    7
      <ItemGroup>
        <EmbeddedResource Update="Properties\TextResources.resx">
          <Generator>PublicResXFileCodeGenerator</Generator>
          <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
          <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
        </EmbeddedResource>
      </ItemGroup>

    一种方法是将共享类/资源放在单独的类库项目中,并在两个网站中引用它们。


    我有一个WinForms应用程序,解决方案中只有一个项目。
    针对.NET Framework 4.0
    使用SharpDevelop 4.3作为我的IDE

    听起来很傻,但我碰巧在我的"Resources.resx"文件中将Logical Name的财产设置为"Resources"。一旦我清理了那块地,所有的工作都会很顺利。

    通常,当你添加随机文件作为EmbeddedResource时,你通常希望将Logical Name设置为合理的,出于某种原因,我在Resources.resx文件上做了同样的操作,结果把它搞砸了……

    希望这能帮助别人。


    当我们使用

    1
    HttpContext.GetGlobalResourceObject()

    除非我们将该调用包装在try/catch语句中,否则将生成该错误。


    由于resx设计器文件依赖于反射,dotfusation也会引发此错误。如果您使用dotfuscator,它将破坏您的resx文件。必须始终将它们作为排除在模糊处理过程中。


    对于我来说,问题是将.resx文件和相关的.cs文件从一个项目复制到另一个项目。两个项目都有相同的名称空间,所以这不是问题所在。

    最后,当我在解决方案资源管理器中注意到在原始项目中.resx文件依赖于.cs文件时,解决了它:

    1
    2
    MyResource.cs
    |_ MyResource.resx

    在复制的项目中,.cs文件依赖于.resx文件:

    1
    2
    MyResource.resx
    |_ MyResource.cs

    结果在第二个项目中,.resx文件被设置为自动生成.cs文件。自动生成的.cs文件正在覆盖从原始项目复制的.cs文件。

    若要解决此问题,请编辑复制项目中每个.resx文件的属性。自定义工具属性将设置为类似resxfilecodegenerator的值。清除.resx文件的自定义工具属性。您需要从原始项目重新复制.cs文件,因为它将被自动生成的文件覆盖。


    在我的例子中,这些添加到Web.config的代码行有很大帮助:

    1
    2
    3
    4
    5
    <system.web>
         ...
        <globalization uiCulture="cs" culture="cs-CZ" />
         ...
    <system.web>

    与构建操作一起:Embedded Resource和自定义工具:PublicResXFileCodeGenerator


    仅仅因为您引用了项目B的dll并不意味着项目A的资源管理器知道项目B的app_globalresources目录。

    您使用的是网站项目还是Web应用程序项目?在后者中,Visual Studio应该允许您链接源代码文件(不确定前者,我从未使用过)。这是一个不太了解但很有用的特性,在这里描述。这样,您就可以将项目B资源文件链接到项目A中。


    要检查的另一件事是,是否在EmbeddedResource上定义了LogicalName或ManifestResourceName。如果您的项目文件正在使用它们,请确保它们被适当地定义,因为它们可能导致资源以您不期望的名称存在。


    在我的例子中,我在同一个文件中的一个Windows窗体上放置了一个新类。

    将新添加的类从该文件中移出修复了该问题。

    请参见这里:网址:http://i.stack.imgur.com/wvu6c.png


    这可能是由不匹配的命名空间造成的。第二个来自顶部的答案(sibi elango's)说右键单击resx文件,并将build选项更改为embeddedresource,但我已经这样做了,仍然有错误。上面的答案(cfinck's)指出了一种通过手动编辑文件来解决这个问题的方法,但是,我在MonoDevelop中遇到了这个问题,并且必须将默认命名空间设置为与调用资源的cs文件(包含以下代码等代码的文件)相同的名称空间…

    1
    this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

    通过GUI设置默认名称空间后,上面的行不再引起异常。


    我也面临着同样的问题,尝试了答案中提到的所有解决方案,但似乎都不起作用。结果是在代码签入到tfs的过程中。TFS没有签入resx文件,它只签入设计器文件。所以所有其他的开发人员在他们的机器上运行时都面临这个问题。手动签入resx文件完成了这个技巧


    当把一个类放在主WinForm类(例如,Form1)之上时,也会发生这种情况。当您查看设计时,会看到这种情况,因为它无法呈现。


    还有另一个原因:如果您的名称空间有一个连字符("-"),那么它将正确地构建和运行,但是资源将不可访问。名称空间(标识符)不应该有连字符,但除了在加载资源时,这似乎不会在任何地方强制执行。在过去的十年里,这已经让我两次心痛。


    双击属性在应用程序部分,检查程序集名称和默认命名空间是否相同