214

我有两个 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 窗体项目的解决方案,我不确定这是否也适用于 Web 项目。

4

32 回答 32

269

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

本来应该:

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

希望这可以帮助下一个人。

于 2011-05-11T19:06:23.047 回答
122

我解决了这样的问题:

  1. 右键单击您的资源文件
  2. 将“构建操作”属性编译更改为“嵌入式资源”
  3. 然后构建并运行

它完美地工作。

于 2012-08-08T12:42:26.270 回答
31

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

于 2013-07-12T20:11:19.243 回答
16

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

在此处输入图像描述

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

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

于 2016-04-07T18:20:24.487 回答
12

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

  • 右键单击您的资源文件
  • 单击菜单项“包含在项目中”
于 2016-12-09T11:25:41.943 回答
11

我发现删除designer.cs文件,从项目中排除resx文件,然后重新包含它通常会在命名空间重构之后解决此类问题(根据CFinck的回答)

于 2013-09-30T22:45:33.383 回答
9

似乎没有人提到这个解决方案。真的很明显 - 但让我绊倒了一会儿......

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

(在 resx 设计器的顶部有一个访问修饰符的下拉菜单)

于 2018-08-17T11:33:05.643 回答
6

我通过转到保存我的资源文件的项目来解决这个问题,向下滚动到它的 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>
于 2018-04-28T17:53:23.037 回答
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
    {
    }
}

移至BackendObject文件末尾(最好将其移至单独的文件)后,进行项目清理+重建解决了该问题。

于 2018-02-08T03:36:32.223 回答
5

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

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

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

于 2016-08-05T17:06:30.107 回答
5

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

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
于 2020-05-19T12:36:30.553 回答
4

就这种情况而言,检查包含资源的程序集是否将默认命名空间设置为相同的文本(项目->属性->默认命名空间;在 VS 中)检查 resx 文件的属性 BuildAction 是否设置为“嵌入式资源“享受... ;)

于 2014-12-18T08:52:24.617 回答
3

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

于 2010-02-08T11:34:28.670 回答
3

谢谢@CFinck!只是给别人一个提示:我用这个改变了 ResourceManager 行:

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

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

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

于 2011-11-11T19:23:59.500 回答
3

只是另一个案例。我复制了一个包含两个项目的解决方案,并在 Windows 资源管理器中对它们进行了部分重命名(文件夹名称、.sln 和 .csproj 文件名),部分在 Visual Studio 中通过大量的查找和替换操作(命名空间等)进行了重命名。尽管如此,仍然发生了 OP 声明的异常。我发现程序集和命名空间名称仍然很旧。

尽管该项目和其他所有内容都已命名为OfficeStyle 并且命名为LinckusAssembly nameDefault namespace

老情况

更正后一切正常,编译和运行时间:)

新形势

于 2019-08-09T08:21:13.187 回答
2

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

于 2012-09-20T20:31:35.750 回答
2

当我们使用

HttpContext.GetGlobalResourceObject()

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

于 2013-05-30T17:55:44.370 回答
2

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

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

MyResource.cs
|_ MyResource.resx

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

MyResource.resx
|_ MyResource.cs

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

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

于 2015-04-01T09:27:34.317 回答
2

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

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

通过 GUI 设置默认命名空间后,上面的行不再导致异常。

于 2017-11-30T22:32:01.700 回答
1

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

听起来很傻,但我碰巧在我的文件中Logical Name设置了该属性。一旦我清理了那个财产,一切都很好。"Resources""Resources.resx"

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

希望这可以帮助某人。

于 2014-06-10T20:49:39.583 回答
1

就我而言,添加的这些代码行Web.config有很大帮助:

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

连同构建操作:Embedded Resource和自定义工具:PublicResXFileCodeGenerator.

于 2014-09-15T19:20:04.697 回答
1

就我而言,我试图将表单从一个项目迁移到另一个项目。原来我只是忘记添加Form.resx到新项目中。在表单中,我使用了一些图标,因此它依赖于资源。

于 2021-08-09T09:10:33.160 回答
1

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

接受的答案并没有解决我的问题。

我不得不将 Build Action 从 更改CompileEmbedded Resource并且它对我有用。

您可以使用以下步骤执行相同操作:

  1. 右键单击迁移。
  2. 将“构建操作”属性“编译”更改为“嵌入式资源”
  3. 运行更新数据库命令。
于 2020-01-03T14:49:40.637 回答
0

就我而言,Build Action资源文件已经存在Embedded Resource,但每次我运行时update-database,我都会遇到同样的错误,所以我做了其他步骤并且它有效:

  1. Build Action将属性更改为Compile
  2. 构建(有很多错误)
  3. Build Action将属性更改为Embedded Resource
  4. update-database

由于某种原因,它起作用了。

于 2021-02-18T17:01:22.263 回答
0

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

于 2018-02-28T12:56:04.480 回答
0

尝试在 EF 上运行 update-database 命令时遇到了同样的问题。结果是引发异常的迁移将 .resx 文件排除在项目之外。我只是右键单击 .resx 文件并单击“包含在项目中”。问题解决了。

于 2021-02-17T13:18:03.080 回答
0

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

于 2019-05-24T19:53:01.453 回答
0

其他答案都没有为我解决。我已经将许多表单和控件从一个程序集移动到另一个程序集,修复了所有命名空间并解决了这个问题。

为了使移动的控件和表单与其他控件和表单分开,我将它们放在一个子文件夹中。一个资源参考已按照其他答案之一的建议进行了更新。IDE 警告我文件路径与命名空间不匹配并带有蓝色波浪,但这不是错误,所以我最初忽略了它。

当没有任何东西可以为我解决它并且我不知道有什么更好的尝试时,我最终将控件和表单移出它们的子文件夹(未在命名空间中表示)并且问题消失了。

显然 WinForms 对文件夹结构仍有一些硬依赖。

于 2022-01-14T11:05:50.737 回答
0

还有一个原因:如果您的命名空间有一个连字符(“-”),那么它将正确构建和运行,但资源将无法访问。命名空间(标识符)不应该有连字符,但这似乎在任何地方都没有强制执行,除了加载资源。在这十年里,这让我两次燃烧。

于 2019-02-09T19:25:53.987 回答
0

对于 NetCore 项目有类似的问题,我注意到在添加迁移(让我们命名WhateverMigration)之后,.resx文件引用作为 EmbeddedResource 没有添加到.csproj即使一切看起来都很好。所以我打开了我的.csproj文件并添加了:

<EmbeddedResource Update="Migrations\202107071914322_WhateverMigration.resx">
    <Generator></Generator>
    <DependentUpon>202107071914322_WhateverMigration.cs</DependentUpon>
</EmbeddedResource>
于 2021-07-07T19:30:58.473 回答
0

csproj在将 Windows 窗体迁移到新的 SDK 样式项目格式时,您也可能遇到此异常。如果子文件夹中有任何表单或用户控件,则*.resx文件将使用包含子文件夹的命名空间生成,该命名空间可能与*.Designer.cs命名空间不匹配。解决方案是将以下内容添加到csproj

<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
于 2021-09-15T01:58:10.807 回答
-1

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

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

于 2010-01-28T15:23:13.983 回答