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


194

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

mscorlib.dll中发生类型'System.Resources.MissingManifestResourceException'的异常,但未在用户代码中处理。

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

是什么原因造成的?

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

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

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


这些是什么类型的项目?2个网站?1个网站,1个类库?
红润

两个ASP.NET网站项目。
dev.e.loper 2010年

11
+1代表To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.解决了我的问题。
奥马尔·奥斯曼(OmarOthman)2011年

1
使用Windows.Forms Project Microsoft帮助链接为您的问题定义+1,从而解决了我的问题。
DarrenMB 2014年

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

Answers:


257

我只是在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);

希望这对下一个人有帮助。


5
+1很好地说明了原因在设计器文件中的位置。发现并修复了相同的问题,谢谢您:)
Gone Coding,

1
链接:ResourceManager类的MSDN文档。
Boinst'7

3
谢谢,它帮助我解决了这个问题。也可以删除设计器文件,然后打开然后保存resx文件以正确地重新生成设计器文件。
2013年

1
我遇到了同样的问题,这就是我想要的答案。可悲的是它没有在编译时出现:-(谢谢
noob 2014年

2
谢谢也有这个问题,但这是因为我添加了一个与项目名称空间的最后一部分同名的子文件夹,所以它正在寻找project.folder.folder.class而不是project.folder.class。我将其移至根目录,现在它可以工作了!
SelAromDotNet 2015年

115

我解决了这样的问题:

  1. 右键单击您的ResourceFile
  2. 将“生成操作”属性更改为“嵌入资源”
  3. 然后构建并运行

它完美地工作。


@sibi Elango我右键单击我的ResourceFile,但是找不到Build Action部分。
S5498658

1
@ S5498658如果在上下文菜单中(右键单击)没有看到此内容,请在“属性”面板(通常位于解决方案资源管理器下方)中查看。
定义

它的构建动作,但是仍然无法正常工作。我还检查了目录和属性下的目录是否相同。
信天翁

1
如果答案能解释为什么该解决方案有效,那就太好了。
Luis Teijon

这真是太棒了
code4j

22

当我尝试从一个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文件,因为它是自动生成的。


12

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

在此处输入图片说明

由于该参数中的名称空间不再与该类的名称空间匹配,因此应用程序在运行时变得混乱。

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


1
正是我的问题。感谢分享!
AcidJunkie '16

相同:从PCL迁移到.NET Standard之后,它发生了,当我创建一个临时项目和名称空间时,我复制了所有可移植文件,删除了可移植项目,并将名称空间还原为原始名称,此行仍然包含临时名称和名称空间。迁移过程中的名称空间。
Zerga

11

发生这种情况是因为*.resх排除在迁移之外。

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

2
这为我解决了。通常,resx文件是自动添加的。我做了一个合并,在这里我不得不更改项目文件并手动添加迁移,所以也许与它有关
聪明的

为我工作。我必须添加每个迁移的所有* .resx文件。谢谢
m.rufca

7

我发现删除名称空间重构后的designer.cs文件(从项目中排除resx文件),然后重新包含它通常可以解决此问题,方法是按照名称空间进行重构(根据CFinck的回答)


这就是为我做的!(尝试了CFinck的答案,因为它似乎很相关,但是没有用)
2015年

确实是最快的解决方案之一
Lorenz Lo Sauer

6

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

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

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


4

单单Sibi Elangos的回答对我来说还不够,所以我不得不

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

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


4

就我而言,该问题是由错误的类定义引起的:

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分配到最后(更好地分离文件)之后,执行项目清理+重建解决了该问题。


1
哇,我不知道文件开头的类错误会严重破坏事情。
BrainStorm.exe

4

通过转到保存我的资源文件的项目,向下滚动到其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>

3

就这种情况而言,检查包含资源的程序集是否将默认名称空间设置为相同的文本(在Project-> Properties-> Default名称空间;在VS中);还检查resx文件的BuildAction属性是否设置为“ Embedded”。资源“享受...;)


1
嗨,您的意思是默认名称空间(xxx)文本应与代码中的相同: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV

2

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


2
那么肯定是同样的问题,不是吗?
Brett Rigby

2

谢谢@CFinck!只是给其他人一个提示:我用以下方法更改了ResourceManager行:

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

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

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


1

Dotfuscation也会引发此错误,因为resx设计器文件依赖于反射。如果您使用的是Dotfuscator,它将破坏您的resx文件。您必须始终将它们添加为混淆过程的排除项。


1

当我们使用

HttpContext.GetGlobalResourceObject()

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


1

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

听起来很傻,但是我碰巧在文件上Logical Name设置了该属性。一旦我清除了该财产,所有工程都将正常进行。"Resources""Resources.resx"

通常,当您将随机文件添加为时EmbeddedResource,通常Logical Name出于某种原因,您通常希望将设置为合理的值,而我在Resources.resx文件上做了相同的操作,这一切都搞砸了...

希望这对某人有帮助。


我似乎也有这个。我猜是命名冲突,很好找到!
2014年

1

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

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

MyResource.cs
|_ MyResource.resx

在复制的项目中,.cs文件取决于.resx文件:

MyResource.resx
|_ MyResource.cs

事实证明,在第二个项目中,.resx文件已设置为自动生成.cs文件。自动生成的.cs文件将覆盖从原始项目复制的.cs文件。

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



1

这可能是由于名称空间不匹配引起的。排名第二的答案(Sibi Elango的答案)是右键单击resx文件,然后将Build选项更改为EmbeddedResource,但我已经这样做了,但仍然出现错误。最高答案(CFinck's)指出了一种通过手动编辑文件来解决此问题的方法,但是,我在MonoDevelop中遇到了此问题,必须将默认名称空间设置为与调用资源的cs文件相同的文件(包含的代码,例如下面的代码)...

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

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


1

只是另一种情况。我复制了一个包含两个项目的解决方案,并在Windows资源管理器中将它们重命名为一部分(文件夹名称,.sln和.csproj文件名),并在Visual Studio中使用了大量的“查找和替换”操作(名称空间等)对其进行了重命名。但是,OP仍然指出了例外情况。我发现Assembly和Namespace名称仍然很旧。

尽管该项目及其他所有项目已被命名为OfficeStyleAssembly name并且Default namespace仍被命名为Linckus

旧情况

进行此更正后,一切都再次正常运行,请编译并运行:)

新情况


0

在我的情况下,这些代码行增加Web.config了很多帮助:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

连同构建行动:Embedded Resource与自定义工具:PublicResXFileCodeGenerator


0

“ 应用程序”部分中的“ 双击属性”检查程序集名称默认名称空间是否相同


0

我也面临着同样的问题,尝试了答案中提到的所有解决方案,但似乎都没有用。原来,在将代码签入TFS期间。TFS未检入Resx文件,仅检入了设计器文件。因此,所有其他开发人员在其计算机上运行时都面临此问题。手动签入resx文件就可以了


您说“签到”是什么意思?
Fandango68 '18

将文件推送到TFS
Kayani,

0

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


0

另一个原因:如果您的名称空间带有连字符(“-”),则它将正确构建并运行,但是将无法访问资源。命名空间(标识符)不应该带有连字符,但是除了加载资源外,似乎没有在任何地方强制使用连字符。十年来,这烧了我两次。


0

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


0

我在运行迁移命令时遇到了这个问题。Update-Database在Package Manager控制台中。

接受的答案不能解决我的问题。

我不得不将“构建操作”从更改为CompileEmbedded Resource并且对我有用。

您可以按照以下步骤进行操作:

  1. 右键单击迁移。
  2. 将“生成操作”属性“编译”更改为“嵌入资源”
  3. 运行更新数据库命令。

0

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

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>


-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.