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

时间:2010-01-13 16:38:03

标签: .net asp.net embedded-resource resourcemanager

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

  

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

     

无法找到适合指定文化或中性文化的任何资源。确保在编译时将“Resources.Blah.resources”正确嵌入或链接到程序集“App_GlobalResources.sn_flri6”,或者所有所需的附属程序集都是可加载和完全签名的。

造成这种情况的原因是什么?

微软网站上有一篇关于这个http://support.microsoft.com/kb/318603的文章建议:

  

要解决此问题,请移动所有其他类定义,使它们出现在表单的类定义之后。

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

32 个答案:

答案 0 :(得分:235)

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

希望这有助于下一个人。

答案 1 :(得分:108)

我解决了这个问题:

  1. 右键单击您的ResourceFile
  2. 将“Build Action”属性编译为“Embedded Resource”
  3. 然后构建并运行
  4. 效果很好。

答案 2 :(得分:21)

当我尝试从一个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文件。
  6. 注意:我会避免编辑resource.designer.cs文件,因为这是自动生成的。

答案 3 :(得分:12)

在我的案例中,一系列经过深思熟虑的全局文本替换无意中更改了资源设计器cs文件中的这一行。

enter image description here

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

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

答案 4 :(得分:9)

之所以发生这种情况,是因为*.resх已从迁移中排除。

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

答案 5 :(得分:7)

我发现删除designer.cs文件,从项目中排除resx文件然后重新包含它经常修复这种问题,遵循命名空间重构(根据CFinck的回答)

答案 6 :(得分:5)

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

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

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

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

答案 8 :(得分:3)

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

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

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

我通过转到保存资源文件的项目解决了这个问题,向下滚动到其ItemGroup并添加了与编译器期望的路径相对应的逻辑名称。

My 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>

答案 11 :(得分:2)

就此情况而言,检查包含资源的程序集是否将默认名称空间设置为相同的文本(Project-&gt; Properties-&gt; Default namespace;在VS中) 检查resx文件是否具有将属性BuildAction设置为&#34;嵌入式资源&#34; 享受......;)

答案 12 :(得分:2)

谢谢@CFinck! 只是为其他人添加一个提示:我用这个改变了ResourceManager行:

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

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

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

答案 13 :(得分:1)

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

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

MyResource.cs
|_ MyResource.resx

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

MyResource.resx
|_ MyResource.cs

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

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

答案 14 :(得分:1)

就我而言,我试图将表单从一个项目迁移到另一个项目。结果我只是忘记将 public class App extends Singleton { @Override public void onCreate() { super.onCreate(); List<Module> list = new ArrayList<Module>(); list.add(localDbModule); KoinApplication koin = KoinAndroidApplication .create(this) .modules(list); startKoin(koin); } } 添加到新项目中。在表单中我使用了一些图标,因此它依赖于资源。

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

Dotfuscation也引发了这个错误,因为resx设计器文件依赖于反射。如果您使用的是Dotfuscator,它将破坏您的resx文件。您必须始终将它们添加为模糊处理过程中的排除。

答案 17 :(得分:1)

当我们使用时

HttpContext.GetGlobalResourceObject()

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

答案 18 :(得分:1)

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

听起来很傻,但我的Logical Name文件上的"Resources"属性设置为"Resources.resx"。一旦我清理了那个属性,所有的工作都会变得很糟糕。

通常,当您将随机文件添加为EmbeddedResource时,通常需要将Logical Name设置为合理的值,出于某种原因,我在Resources.resx文件上执行相同的操作搞砸了......

希望这有助于某人。

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

在我的情况下,我在同一个文件中的Windows窗体上放置了一个新类。

将新添加的类移出该文件修复了问题。

见这里: http://i.stack.imgur.com/wVu6c.png

答案 22 :(得分:0)

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

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

答案 26 :(得分:0)

另一种情况。我复制了一个包含两个项目的解决方案,并在Windows资源管理器中将它们重命名为一部分(文件夹名称,.sln和.csproj文件名),并在Visual Studio中使用了大量的“查找和替换”操作(名称空间等)对其进行了重命名。然而,《任择议定书》规定的例外情况仍然发生。我发现程序集和命名空间的名称仍然很旧。

尽管该项目和其他所有项目均已被命名为 OfficeStyle ,但Assembly nameDefault namespace仍被命名为 Linckus

Old situation

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

New situation

答案 27 :(得分:0)

我在程序包管理器控制台中运行迁移命令时遇到此问题。#ifdef PLATFORM_MAC_OS_X SidecarPresenter* presenter = [SidecarPresenter alloc]; [presenter initWithImageUrl:[NSURL fileURLWithPath:documentFilename] andSidecarExtension:sidecarExtension]]; [presenter autorelease]; [NSFileCoordinator addFilePresenter:presenter]; NSFileCoordinator* coordinator = [[[NSFileCoordinator alloc] initWithFilePresenter:presenter] autorelease]; NSError* error = nil; [coordinator coordinateReadingItemAtURL:presenter.presentedItemURL options:NSFileCoordinatorReadingWithoutChanges error:&error byAccessor:^(NSURL* newURL) { std::ifstream strm([newURL fileSystemRepresentation]); foo(strm); }]; [NSFileCoordinator removeFilePresenter:presenter]; #else std::ifstream strm(documentFilename); foo(strm); #endif

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

我不得不将Build Action从Update-Database更改为Compile,它对我有用。

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

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

答案 28 :(得分:0)

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

答案 29 :(得分:0)

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

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

出于某种原因,它奏效了。

答案 30 :(得分:0)

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

.csproj

答案 31 :(得分:0)

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

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

与构建操作一起:Embedded Resource和自定义工具:PublicResXFileCodeGenerator