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

问题描述 投票:171回答:25

我有两个ASP.NET Web项目(项目A和项目B)。当项目A类实例化类项目B的,它使用一个资源文件Blah.resx,我得到这个错误:

类型“System.Resources.MissingManifestResourceException”的异常出现在mscorlib.dll,但在用户代码中没有处理。

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

什么造成的?

有微软的这个http://support.microsoft.com/kb/318603这表明网站的一篇文章:

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

这是Windows窗体项目的解决方案,我不知道如果这也适用于Web项目。

.net asp.net embedded-resource resourcemanager
25个回答
242
投票

我只是在一个WPF项目打这个同样的异常。我们最近搬到另一个命名空间(ProblemAssembly.SupportProblemAssembly.Controls)组件内发生的问题。试图从存在于组件上的第二资源文件访问资源时,唯一的例外发生了什么。

原来,额外的资源文件没有正确地摆脱旧的命名空间名称引用新的命名空间名称。

在designer.cs的资源文件,还有一个静态属性来获取的ResourceManager。内吸,字符串仍参照旧的命名空间。一旦修正,以新的命名空间,这个问题得到了解决:

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);

希望这有助于下一个人。


2
投票

一种方法是把共享类/资源在一个单独的类库项目,并在这两个网站是指他们。


2
投票

谢谢@CFinck!只是到末端添加到别人:我改变了的ResourceManager符合这样的:

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

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

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


2
投票

至于这种情况下,关注检查是否包含资源装配有默认的命名空间设置为相同的文本(项目 - >属性 - >默认命名空间;在VS)检查以及如果RESX文件有一个属性BuildAction的设置为“嵌入式资源”享受...;)


2
投票

我首先要到我的资源文件保存的项目,上下滚动到它的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>

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文件相同,并且搞砸了这一切......

希望这可以帮助别人。


1
投票

对我来说,这个问题是复制.resx文件和相关的.cs文件从一个项目到另一个。这两个项目有相同的命名空间,这样是没有问题的。

终于解决了它,当我在Solution Explorer中注意到,在原项目中的.resx文件是依赖于文件的.cs:

MyResource.cs
|_ MyResource.resx

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

MyResource.resx
|_ MyResource.cs

原来,在第二个项目不知何故.resx文件已被设置为自动生成的.cs文件。自动生成的.cs文件被覆盖原始项目复制的.cs文件。

要解决该问题编辑每个.resx文件的属性,在复制的项目。自定义工具属性将被设置为类似ResXFileCodeGenerator。清除.resx文件的自定义工具属性。你需要,因为它会已通过自动生成的文件覆盖的cs文件从原始项目重新复制。


0
投票

仅仅因为你要引用项目B的DLL并不意味着项目A的资源管理器是了解项目B的App_GlobalResources文件目录。

您使用的网站项目或Web应用程序项目?在后者中,Visual Studio中应该让你链接的源代码文件(不知道以前,我从来没有使用过)。这是一个很少知道,但很有用的功能,这is described here。这样一来,就可以在B项目的资源文件链接到项目A.


0
投票

在我的情况下添加几行代码来Web.config帮助了很多:

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

连同生成操作:Embedded Resource和自定义工具:PublicResXFileCodeGenerator


110
投票

我解决了这样的问题:

  1. 右键单击您的resourcefile
  2. 更改“生成操作”属性纂要“嵌入的资源”
  3. 然后建立并运行

它完美的作品。


0
投票

在应用部分双击性能检查大会名称和默认命名空间是相同的


0
投票

在我来说,我已经放在Windows窗体顶部的新的类,在同一文件中。

移动新加入的类出该文件的解决了这一问题。

在这里看到:http://i.stack.imgur.com/wVu6c.png


0
投票

这可以通过命名空间不匹配造成的。从上面的答案(思碧Elango的)第二次说要请右键单击该文件RESX,并改变构建选项EmbeddedResource,但我已经这样做了,仍然有错误。顶端回答(CFinck的)指出然而这通过手工编辑文件固定的一个办法,我只好在MonoDevelop中这个问题,必须设置默认的命名空间相同的,将其要求的资源(该文件的CS文件,该文件包含的代码,如下面的代码)...

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

通过图形用户界面设置默认名称空间后,上述不再行出现异常。


0
投票

我也面临着同样的问题,试图在回答中提到的所有解决方案,但似乎没有工作。该代码签入到TFS中横空出世。 TFS没有签入的RESX文件只在设计文件检查。因此,所有其他开发人员在其计算机上运行时,面临着这个问题。检查在RESX文件手工做的伎俩


0
投票

把一个类时,主要的WinForm类以上(Form1上,例如)也可能发生这种你可以看到这个当你在设计,因为它不能被渲染。


0
投票

还有一个原因:如果你的命名空间有一个连字符(“ - ”),那么它会建立和运行正常,但资源将无法访问。命名空间(标识符)不应该有连字符,但这并不似乎除了在加载资源的任何地方执行。这已经烧毁了我两次在过去的十年。


0
投票

检查的另一件事是,如果你有LogicalName或ManifestResourceName上EmbeddedResource定义。确保那些被适当定义,如果您的项目文件正在使用他们,因为他们可能会导致资源生活在你不期望的名称。


0
投票

只是另一种情况。我复制了两个项目的解决方案,并在Windows资源管理器(文件夹名称,并且的.sln .csproj的文件名)部分给他们改名,部分有一个庞大的查找和替换在Visual Studio中的动作(命名空间等)。然而由OP规定的例外仍时有发生。我发现大会和命名空间的名称仍然旧。

虽然该项目和其他一切已经命名OfficeStyle的Assembly nameDefault namespace仍然命名Linckus。

Old situation

在此之后修正再次一切工作正常,编译和运行时间:)

New situation


21
投票

当我试图从另一个C#项目一个C#项目共享resource.resx文件,我得到了这个问题。关于Form类移动到它的文件的开头的建议是不恰当的。这是我如何解决它。你基本上是用从第二个项目的链接,然后再启用resource.designer.cs文件的再生。

  1. 删除第二个项目的Properties/Resources.resx文件
  2. 第一个项目的Properties/Resources.resx文件添加为纽带的属性文件夹中的第二个项目。不要把它添加到项目的根目录。
  3. 不要添加的第一个项目的Properties/Resources.designer.cs
  4. 关于第二个项目的Resources.resx的属性,添加ResXFileCodeGenerator作为CustomTool
  5. 右键单击Resources.resx,选择“运行自定义工具”。这将产生一个新的designer.cs文件。

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


12
投票

在我的情况了一系列严重的全球思想文本替换的在不经意间改变了资源的设计师CS文件这一行。

enter image description here

由于这样的说法命名空间没有了类的命名空间匹配,应用得到了在运行时混淆。

检查设计师的命名空间,该行的字符串参数匹配。


10
投票

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

  • 右键单击您的resourcefile
  • 点击菜单项“包括项目”

7
投票

我发现,删除designer.cs文件,从项目中排除的resx文件,然后再包括它往往是固定的这种问题,下面的命名空间重构(按CFinck的答案)


5
投票

没有人似乎已经提到了这个解决方案。显而易见真的 - 但是我绊倒了一会儿...

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

(在RESX设计者有一个下拉在顶部用于接入改性剂)


4
投票

思碧Elangos答案独显不够的我,所以我不得不

  • 右键单击您的resourcefile
  • 更改“生成操作”属性
  • 纂要“嵌入的资源”
  • 构建和部署

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


3
投票

就我而言,这个问题引起定义类错误的方法:

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到底(最好单独的文件),在做项目+清洁重建后解决了问题。

热门问题
推荐问题
最新问题