找不到适合特定文化或中性文化的资源
我有两个ASP.NET Web项目(ProjectA和ProjectB)。 当ProjectA中的类实例化一个使用资源文件Blah.resx的ProjectB类时,我得到这个错误:
mscorlib.dll中发生types为“System.Resources.MissingManifestResourceException”的exception,但未在用户代码中处理。
找不到适合特定文化或中性文化的资源。 确保在编译时“Resources.Blah.resources”已正确embedded或链接到程序集“App_GlobalResources.sn_flri6”,或者所有需要的附属程序集均可加载并完全签名。
什么导致这个?
微软的网站上有一篇关于这个http://support.microsoft.com/kb/318603的文章,它build议:
要解决此问题,请移动所有其他类定义,以便它们出现在窗体的类定义之后。
这是Windows窗体项目的解决scheme,我不确定这是否也适用于Web项目。
我只是在WPF项目中遇到了这个exception。 问题发生在我们最近移动到另一个名称空间( ProblemAssembly.Support
ProblemAssembly.Controls
)的ProblemAssembly.Support
ProblemAssembly.Controls
。 尝试从程序集中存在的第二个资源文件访问资源时发生exception。
原来,额外的资源文件没有正确地将引用从旧的名称空间名称移动到新的名称空间名称。
在资源文件的designer.cs中,有一个用于获取ResourceManager的静态属性。 在那个getter中,这个string仍然指向旧的名字空间。 一旦纠正到新的命名空间,问题就解决了:
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);
希望这有助于下一个人。
我解决了这样的问题:
- 右键点击你的ResourceFile
- 更改“Build Action”属性编译为“Embedded Resource”
- 然后build立并运行
它完美的作品。
当我尝试与另一个C#项目共享一个C#项目中的resource.resx文件时,我遇到了这个问题。 将Form类移到文件开头的build议是不合适的。 这就是我解决它的方法。 本质上,使用从第二个项目到第一个项目的链接,然后启用resource.designer.cs
文件的重新生成。
- 删除第二个项目的
Properties/Resources.resx
文件 - 将第一个项目的
Properties/Resources.resx
文件作为LINK添加到第二个项目的Properties文件夹中。 不要将其添加到项目的根级别。 - 不要添加第一个项目的
Properties/Resources.designer.cs
! - 在第二个项目的
Resources.resx
的属性上,添加ResXFileCodeGenerator
作为CustomTool - 右键单击
Resources.resx
并select“运行自定义工具”。 这将生成一个新的designer.cs文件。
注意:我会避免编辑resource.designer.cs文件,因为这是自动生成的。
发生这种情况是因为*.resх
从迁移中排除。
- 右键点击你的ResourceFile
- 点击菜单项“包含在项目中”
就我而言,一系列被认为是全球性的文本替代品在资源devise器的cs文件中无意中改变了这一行。
由于该参数中的名称空间不再与该类的名称空间相匹配,因此应用程序在运行时感到困惑。
检查devise器的名称空间是否与该行中的string参数匹配。
我发现,删除designer.cs文件,从项目中排除resx文件,然后重新包括它通常解决了这种问题,继命名空间重构(根据CFinck的答案)
一种方法是将共享的类/资源放在一个单独的类库项目中,并在两个网站中引用它们。
谢谢@CFinck! 只是为其他人添加一个提示:我改变了这个ResourceManager行:
New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())
我在vb.net,但我认为在C#唯一的区别将是+而不是连接string。
这样我可以在两个共享资源的类似项目中使用相同的链接程序集文件。
Sibi Elangos的回答对我来说是不够的,所以我不得不这样做
- 右键点击你的ResourceFile
- 更改“生成操作”属性
- 编译为“embedded式资源”
- 构build和部署
这将在/bin
文件夹中生成App_GlobalResources,现在将该文件夹也复制到Web应用程序的根目录
这个错误也是由Dotfuscation引发的,因为resxdevise器文件依赖于reflection。 如果你正在使用Dotfuscator,它会打破你的resx文件。 您必须始终将其添加为混淆过程中的排除项。
当我们使用
HttpContext.GetGlobalResourceObject()
除非我们在try / catch语句中包装这个调用,否则会产生这个错误。
我有一个WinForms应用程序与解决scheme中的单个项目。
面向.NET Framework 4.0
使用SharpDevelop 4.3
作为我的IDE
听起来很愚蠢,但我碰巧在我的"Resources.resx"
文件中将Logical Name
属性设置为"Resources"
。 一旦我清除了这个财产,所有的作品都是h </s>的。
通常,当您将随机文件添加为EmbeddedResource
,通常需要将Logical Name
设置为合理的值,出于某种原因,我在Resources.resx
文件上也做了相同的操作,并将其全部拧紧。
希望这有助于某人。
就这种情况而言,检查包含资源的程序集是否将默认命名空间设置为相同的文本(在VS中为Project-> Properties-> Default命名空间);检查resx文件的属性BuildAction是否设置为“Embedded资源“享受…;)
对我来说,问题是从一个项目复制.resx文件和相关的.cs文件到另一个。 两个项目都有相同的命名空间,所以这不是问题。
最后解决了它,当我在解决scheme资源pipe理器中注意到,在原始项目中,.resx文件依赖于.cs文件:
MyResource.cs |_ MyResource.resx
在复制的项目中,.cs文件依赖于.resx文件:
MyResource.resx |_ MyResource.cs
事实certificate,在第二个项目中.resx文件已被设置为自动生成.cs文件。 自动生成的.cs文件覆盖了从原始项目复制的.cs文件。
要解决该问题,请编辑复制项目中每个.resx文件的属性。 自定义工具属性将被设置为像ResXFileCodeGenerator 。 清除.resx文件的自定义工具属性。 您将需要从原始项目中重新复制.cs文件,因为它将被自动生成的文件覆盖。
仅仅因为你引用了项目B的DLL,并不意味着项目A的资源pipe理器知道项目B的App_GlobalResources目录。
您是使用网站项目还是Web应用程序项目? 在后者中,Visual Studio应该允许你链接源代码文件(不知道前者,我从来没有使用过)。 这是一个小知识,但有用的function, 这里描述 。 这样,您可以将项目B资源文件链接到项目A.
在我的情况下,这些代码添加到Web.config
帮助了很多:
<system.web> ... <globalization uiCulture="cs" culture="cs-CZ" /> ... <system.web>
结合构build操作: Embedded Resource
和自定义工具: PublicResXFileCodeGenerator
。
应用程序部分中的双击属性检查程序集名称和默认名称空间是相同的
在我的情况下,我已经放在一个Windows窗体的顶部,在同一个文件中的新类。
将新添加的类移出该文件解决了问题。
看到这里: http : //i.stack.imgur.com/wVu6c.png