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

dev*_*per 179 .net asp.net resourcemanager embedded-resource

我有两个ASP.NET Web项目(ProjectA和ProjectB).当ProjectA中的类实例化一个使用资源文件Blah.resx的ProjectB时,我收到此错误:

mscorlib.dll中出现"System.Resources.MissingManifestResourceException"类型的异常,但未在用户代码中处理.

找不到适合指定文化或中性文化的资源.确保在编译时将"Resources.Blah.resources"正确嵌入或链接到程序集"App_GlobalResources.sn_flri6",或者所有所需的附属程序集都是可加载和完全签名的.

是什么导致了这个?

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

若要解决此问题,请移动所有其他类定义,以便它们出现在窗体的类定义之后.

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

CFi*_*nck 245

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

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

在资源文件的designer.cs中,有一个静态属性来获取ResourceManager.在该getter中,该字符串仍然引用旧的命名空间.一旦将其更正为新的命名空间,问题就解决了:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);
Run Code Online (Sandbox Code Playgroud)

本来应该:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);
Run Code Online (Sandbox Code Playgroud)

希望这有助于下一个人.

  • +1有关在设计器文件中找到原因的位置的详细说明.发现并修复同样的问题,谢谢你:) (5认同)
  • 谢谢它帮助我解决了这个问题.也可以删除设计器文件,然后打开然后保存resx文件以正确重新生成设计器文件. (3认同)
  • 谢谢你也有这个问题但是因为我添加了一个与项目命名空间的最后一部分同名的子文件夹,所以它正在寻找project.folder.folder.class而不是project.folder.class.我把它移到根部,现在它排成一行并且正常工作! (2认同)

小智 112

我解决了这个问题:

  1. 右键单击ResourceFile
  2. 更改"构建操作"属性编译为"嵌入式资源"
  3. 然后构建并运行

它完美地运作.

  • 你救了我的一天! (5认同)
  • 如果答案能解释为什么这个解决方案有效,那就太好了。 (2认同)

Mar*_*ata 21

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

  1. 删除第二个项目的Properties/Resources.resx文件
  2. 将第一个项目的Properties/Resources.resx文件作为LINK添加到第二个项目中的Properties文件夹中.不要将它添加到项目的根级别.
  3. 不要添加第一个项目Properties/Resources.designer.cs!
  4. 在第二个项目的属性上Resources.resx,添加ResXFileCodeGenerator为CustomTool
  5. 右键单击Resources.resx并选择"运行自定义工具".这将生成一个新的designer.cs文件.

注意:我会避免编辑resource.designer.cs文件,因为这是自动生成的.


Soh*_*deh 18

对于在 .NET Core 3.0 中遇到此问题的用户,这可能与.NET Core 3.0 中所做的重大更改有关,要解决此问题,只需EmbeddedResourceUseDependentUponConvention在项目 csproj 中将其设置为 false:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是解决方案,但我的问题是我已将 Winforms 项目移植到 SDK 样式的项目。在这种情况下,我必须将“EmbeddedResourceUseDependentUponConvention”设置为“true”而不是“false”。 (4认同)

coc*_*pup 12

在我的情况下,一系列经过深思熟虑的全局文本替换无意中在资源设计器cs文件中更改了这一行.

在此输入图像描述

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

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


小智 11

这是因为在*.res?从迁移中排除.

  • 右键单击ResourceFile
  • 单击菜单项"包含在项目中"

  • 这为我解决了。通常,resx文件是自动添加的。我做了一个合并,我必须更改项目文件并手动添加迁移,所以也许与它有关 (2认同)

Ste*_*rew 7

我发现删除designer.cs文件,从项目中排除resx文件然后重新包含它经常修复这种问题,遵循命名空间重构(根据CFinck的答案)


小智 6

我通过转到保存我的资源文件的项目,向下滚动到其 ItemGroup 并添加与编译器预期的路径相对应的逻辑名称来解决此问题。

我的 EmbeddedResource 看起来像这样:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

现在看起来像这样

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)


Ale*_*erD 5

仅 Sibi Elangos 的回答对我来说是不够的,所以我不得不:

  • 右键单击您的 ResourceFile
  • 更改“构建操作”属性
  • 编译为“嵌入式资源”
  • 构建和部署

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


Jaw*_*ikh 5

就我而言,问题是由类定义的错误顺序引起的。例如,我在 Form 类之前添加了另一个类定义:

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
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

移动BackendObject到文件末尾(更好的方法是将其移动到单独的文件)后,执行项目清理+重建解决了问题。

  • 哇,我不知道在文件开头使用错误的类会严重破坏事情。 (2认同)

Jam*_*s S 5

似乎没有人提到此解决方案。确实很明显-但是让我绊了一下...

新资源文件的默认访问修饰符是Internal(或Friend在VB.Net中)。请确保将其更改为Public

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


Hei*_*nzi -1

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

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