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

230

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

“System.Resources.MissingManifestResourceException”异常发生在mscorlib.dll中,但未在用户代码中处理。

找不到适用于指定区域性或中性区域性的任何资源。请确保在编译时将“Resources.Blah.resources”正确嵌入或链接到程序集“App_GlobalResources.sn_flri6”中,或者所有所需的卫星程序集都可加载并且完全已签名。

这是什么原因引起的?

微软网站上有一篇文章http://support.microsoft.com/kb/318603提到了解决此问题的方法:

为了解决此问题,请将所有其他类定义移动到窗体类定义之后。

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


这些是哪种类型的项目?2个网站?1个网站,1个类库? - Ruddy
两个ASP.NET网站项目。 - dev.e.loper
这个答案解决了我的问题!GetGlobalResourceObject - DanielV
33个回答

283

我在一个WPF项目中遇到了同样的异常。问题出现在我们最近将一个程序集移动到另一个命名空间(从ProblemAssembly.SupportProblemAssembly.Controls)时。当尝试从程序集中访问第二个资源文件中的资源时,异常就会发生。

事实证明,附加的资源文件没有正确地将引用从旧的命名空间名称移动到新的命名空间名称。

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

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

最后一行应该是:

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

1
链接:ResourceManager类的MSDN文档。 - Boinst
4
谢谢,这帮助我解决了问题。还可以删除设计器文件,然后打开并保存resx文件以正确重新生成设计器文件。 - Serge
1
我也遇到了同样的问题,这就是我一直在寻找的答案。不幸的是,它在编译时并没有出现 :-( 谢谢 - 0xC0DED00D
1
还有一件事需要注意: 如果在资源文件属性下设置了要使用的自定义命名空间(那里您也可以选择自定义工具),则此临时字符串不会被更新。 - mare
2
谢谢,我也遇到了这个问题,但是因为我添加了一个与项目命名空间的最后一部分同名的子文件夹,所以它会寻找project.folder.folder.class而不是project.folder.class。我把它移到根目录下,现在它对齐并且可以工作了! - SelAromDotNet
显示剩余4条评论

127
我是这样解决问题的:
  1. 右键点击您的ResourceFile,然后选择“属性”
  2. 将“Build Action”属性从Compile更改为“Embedded Resource”
  3. 然后构建并运行
它完美地运行。

@sibi Elango 我右键点击我的 ResourceFile,但找不到 Build Action 部分。 - S5498658
1
如果您在上下文菜单(右键单击)中看不到此选项,请查看属性面板(通常位于解决方案资源管理器下方)。 - defines
构建操作已经执行,但仍未生效。我还检查了属性下的目录,目录是相同的。 - albatross
6
如果答案能够解释为什么这个解决方案有效,那将是很好的。 - Luis Teijon
对我来说,我只是进行了一次重建,这解决了我的问题。但我也右键单击我的资源文件->属性,并验证“生成操作”以显示“嵌入式资源”。工作正常。 - John Waclawski
1
对我来说,问题在于我的ResourceFile没有被包含在项目中(从imported form导入)。这是有效的,因为错误消息的后半部分说:“确保在编译时正确地嵌入或链接了“Form1.resources”到程序集“ProjectA”,或者所有所需的卫星程序集都可以加载并完全签名。”而这些资源文件没有被嵌入,因为它们的构建操作没有指示将它们嵌入(或者在我的情况下,将它们包含在内)。 - Amanda

34

当我试图将一个C#项目中的resource.resx文件共享给另一个C#项目时,我遇到了这个问题。将Form类移到其文件的开头并不适用于此情况。这是我的解决方法。你需要使用第二个项目到第一个项目的链接,然后启用resource.designer.cs文件的重新生成。

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

注意:最好不要编辑resource.designer.cs文件,因为它是自动生成的。


1
只有在目标/第二个项目中没有现有的Resources.resx文件需要保留时才适用此方法。 - Joniale

18
在我的案例中,一系列想法不周的全局文本替换意外地改变了资源设计器 cs 文件中的这一行。
请检查设计器的命名空间是否与该行的字符串参数匹配,由于该参数中的命名空间不再与类的命名空间匹配,因此应用程序在运行时感到困惑。

输入图像描述


同样的问题:在从PCL迁移到.NET Standard后发生了这种情况,当我创建了一个临时项目和命名空间,并将所有可移植文件复制到其中,删除了可移植项目并将命名空间恢复为原始状态后,此行仍包含迁移过程中的临时命名空间。 - Zerga
1
我使用 Rider 创建了一个名称中带有 '.'(点)的 .resx 文件,生成器会自动将 RecourceManager 参数中的 '.' 替换为 '_'。结果导致出现“找不到资源”的错误。 - barsmaga
使用Rider时遇到了同样的问题。 - Korfu

16

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

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>

4
对我来说这是解决方案,但我的问题是将Winforms项目转移到SDK样式项目。在这种情况下,我必须将EmbeddedResourceUseDependentUponConvention设置为**true**而不是false - Matthew Watson
@MatthewWatson 谢谢!那就是解决方案! - Shahin Dohan
当引用包含SDK样式项目的私有NuGet包时,这对我解决了问题。似乎当它是一个SDK样式项目时,资源的命名是根据文件名而不是类名来命名的,而在旧格式中只使用类名和命名空间。 - Jonas Marty

15

出现这种情况是因为 *.resх 被排除在迁移之外。

  • 右键单击您的ResourceFile
  • 单击菜单项“包含在项目中”

2
这对我解决了问题。通常,resx文件会自动添加。我进行了合并,需要手动更改项目文件并添加迁移,所以可能与此有关。 - smarty
对我有用。我必须添加每个迁移的所有*.resx文件。谢谢。 - m.rufca

11

似乎没有人提到这个解决方案。其实很显然 - 但有一瞬间让我绊倒了...

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

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


11

我发现删除 designer.cs 文件,将 resx 文件从项目中排除,然后重新包含它,经常可以修复此类问题。这是在进行命名空间重构后(根据 CFinck 的回答)的解决方法。


这就是解决我的问题的方法!(尝试了CFinck的答案,看起来相关,但没有起作用) - winwaed
确实是最快的解决方案之一。 - Lorenz Lo Sauer

7
我通过进入存储资源文件的项目,滚动到其ItemGroup并添加一个逻辑名称,该名称对应编译器期望的路径来解决了此问题。 我的EmbeddedResource看起来像这样:
   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

现在它看起来像这样。
  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

5

在我的情况下,问题是由类定义的错误顺序引起的。例如,在我的表单类之前,我添加了另一个类定义:

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移到文件末尾(最好移到单独的文件中),然后进行项目清理+重建即可解决问题。


2
哇,我没有意识到在文件开头使用错误的类会导致事情变得如此糟糕。 - BrainStorm.exe

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