ChatGPT解决这个技术问题 Extra ChatGPT

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

我有两个 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 项目。

这些是什么类型的项目? 2个网站? 1个网站,1个类库?
两个 ASP.NET 网站项目。
这个answer为我解决了这个问题! GetGlobalResourceObject

C
Claus Jørgensen

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

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


链接:ResourceManager 类的 MSDN 文档。
谢谢它帮助我解决了这个问题。也可以删除设计器文件,然后打开并保存 resx 文件以正确重新生成设计器文件。
我有同样的问题,这就是我正在寻找的答案。可悲的是它没有出现在编译时:-(谢谢
还有一点需要注意:如果您在资源文件属性下设置了要使用的自定义命名空间(您还可以在此处选择自定义工具),则此临时字符串不会更新
谢谢也有这个问题,但这是因为我添加了一个与项目命名空间的最后一部分同名的子文件夹,所以它正在寻找 project.folder.folder.class 而不是 project.folder.class。我将它移到了根目录,现在它可以正常工作了!
N
NealWalters

我解决了这样的问题:

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

它完美地工作。


@sibi Elango 我右键单击我的 ResourceFile 但找不到 Build Action 部分。
@S5498658 如果您在上下文菜单中没有看到这个(右键单击),请查看“属性”面板(通常位于解决方案资源管理器下方)。
它的构建动作但仍然无法正常工作。我还检查了目录和目录在属性下是否相同。
如果答案能解释为什么这个解决方案有效,那就太好了。
对我来说,我刚刚进行了重建,这解决了我的问题。但我也右击了我的资源文件 --> 属性并验证了“构建操作”以显示“嵌入式资源”。工作得很好。
M
Mark Lakata

当我尝试与另一个 C# 项目共享一个 C# 项目中的 resource.resx 文件时,我遇到了这个问题。将 Form 类移动到其文件开头的建议是不合适的。这就是我解决它的方法。您实际上是使用从第二个项目到第一个项目的链接,然后启用 resource.designer.cs 文件的重新生成。

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

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


c
cockypup

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

https://i.stack.imgur.com/B4ikl.png

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

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


同样在这里:它发生在从 PCL 迁移到 .NET Standard 之后,当我创建一个临时项目和命名空间时,我将所有可移植文件复制到其中,删除了可移植项目并将命名空间恢复为原始名称,这一行仍然包含临时迁移过程中的命名空间。
我的情况:我使用带有“.”的 Rider 创建 .resx 文件(点)在名称中,生成器自动替换“。”到 RecourceManager 参数中的“_”。结果“找不到资源”
使用 Rider 时遇到同样的问题
M
Matteo Baldi

这是因为 *.resх 被排除在迁移之外。

右键单击您的资源文件

单击菜单项“包含在项目中”


这为我修好了。通常会自动添加 resx 文件。我做了一个合并,我必须更改项目文件并手动添加迁移,所以也许这与它有关
为我工作。我必须添加每个迁移的所有 *.resx 文件。谢谢
S
Stephen Drew

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


这就是为我做的! (尝试了 CFinck 的答案,因为它似乎相关,但它没有用)
确实是最快的解决方案之一
J
James S

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

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

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


S
Soheil Alizadeh

对于在 .NET Core 3.0 中遇到此问题的用户,这可能与在 .NET Core 3.0 中制作的 breaking change 有关,要解决此问题,只需在项目 csproj 中将 EmbeddedResourceUseDependentUponConvention 设置为 false:

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

这是我的解决方案,除了我的问题是我已移植到 SDK 样式项目的 Winforms 项目。在这种情况下,我必须将 EmbeddedResourceUseDependentUponConvention 设置为 true 而不是 false
@MatthewWatson 谢谢!这就是解决方案!
J
Juansero29

我通过转到保存我的资源文件的项目来解决这个问题,向下滚动到它的 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>

C
Cody Gray

单独的 Sibi Elangos's answer 对我来说是不够的,所以我必须:

右键单击您的资源文件

更改“构建操作”属性

编译为“嵌入式资源”

构建和部署

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


C
Cody Gray

就我而言,问题是由错误的类定义顺序引起的。例如,我在 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 移至文件末尾(最好将其移至单独的文件)后,执行项目清理 + 重建解决了该问题。


哇,我不知道在文件开头有错误的类会严重破坏事情。
M
Mohammad Fazeli

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


您好,您的意思是默认命名空间(xxx)文本应该和代码中的一样:Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
S
Subbu

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


那么这肯定是同样的问题,不是吗?
S
Spiky

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

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

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

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


B
Bernoulli IT

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

尽管该项目和其他所有内容都已命名为 OfficeStyle,但 Assembly nameDefault namespace 仍命名为 Linkkus

https://i.stack.imgur.com/YXQ3R.png

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

https://i.stack.imgur.com/8Jrfv.png


T
Trevor Elliott

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


j
jmb_coder

当我们使用

HttpContext.GetGlobalResourceObject()

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


S
Simon Tewsi

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

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

MyResource.cs
|_ MyResource.resx

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

MyResource.resx
|_ MyResource.cs

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

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


P
Poikilos

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

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

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


n
nurchi

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

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

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

希望这可以帮助某人。


m
m_david

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

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

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


i
immirza

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

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

我不得不将 Build Action 从 Compile 更改为 Embedded Resource,它对我有用。

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

右键单击迁移。将“构建操作”属性“编译”更改为“嵌入式资源”运行更新数据库命令。


F
F.zehra

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


K
Kayani

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


b
beanmf

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


D
David Engel

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


L
LuTheZy

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


k
kamal hamidi

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

将 Build Action 属性更改为 Compile Build(出现很多错误)将 Build Action 属性更改回 Embedded Resource update-database

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


M
Mari Faleiros

对于 NetCore 项目有类似的问题,我注意到在添加迁移后(我们将其命名为 WhateverMigration),作为 EmbeddedResource 的 .resx 文件引用没有添加到 .csproj 中,即使所有 似乎< /em> 很好。所以我打开了我的 .csproj 文件并添加了:

<EmbeddedResource Update="Migrations\202107071914322_WhateverMigration.resx">
    <Generator></Generator>
    <DependentUpon>202107071914322_WhateverMigration.cs</DependentUpon>
</EmbeddedResource>

M
Michael Csikos

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

<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>