我有两个ASP。NET Web项目(ProjectA和projecb)。当ProjectA中的类正在实例化ProjectB中的一个类时,它使用了一个资源文件Blah。resx,我得到这个错误:

一个System.Resources类型的异常。mscorlib.dll中出现了MissingManifestResourceException',但在用户代码中没有处理。 无法找到适用于指定区域性或中性区域性的任何资源。确保“资源。等等。”资源“正确嵌入或链接到程序集”App_GlobalResources。Sn_flri6”,或者所有所需的附属程序集都是可加载的并具有全符号。

是什么导致的?

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

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

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


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

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


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


我只是在WPF项目中碰到了同样的异常。问题发生在我们最近移动到另一个名称空间(ProblemAssembly)的程序集中。支持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);

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

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

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

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


我是这样解决的:

右键点击资源文件,然后选择属性 将“Build Action”属性编译为“Embedded Resource” 然后构建并运行

它工作得很完美。


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


当我们使用

HttpContext.GetGlobalResourceObject()

它会产生那个错误,除非我们用try/catch语句包装这个调用。


当我尝试共享资源时。resx文件从一个c#项目到另一个c#项目,我得到了这个问题。将Form类移到其文件开头的建议是不合适的。我就是这样解出来的。您实际上使用了从第二个项目到第一个项目的链接,然后启用resource.designer.cs文件的再生。

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

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


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


我有一个WinForms应用程序,解决方案中只有一个项目。 瞄准。net Framework 4.0 使用SharpDevelop 4.3作为我的IDE

听起来很傻,但我碰巧在“资源”上将“逻辑名称”属性设置为“资源”。resx文件”。一旦我清理了那块地,一切都没问题了。

通常,当您将随机文件添加为EmbeddedResource时,您通常希望将逻辑名称设置为合理的名称,出于某种原因,我在资源中也做了同样的操作。Resx文件,这一切都搞砸了…

希望这能帮助到一些人。


在我的例子中,这些代码行添加到Web。Config帮了大忙:

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

连同构建动作:嵌入式资源和自定义工具:PublicResXFileCodeGenerator。


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


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

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

MyResource.cs
|_ MyResource.resx

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

MyResource.resx
|_ MyResource.cs

原来在第二个项目中,.resx文件被设置为自动生成.cs文件。自动生成的.cs文件覆盖了从原始项目复制的.cs文件。

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


在我的例子中,一系列考虑不良的全局文本替换无意中改变了资源设计器cs文件中的这一行。

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

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


只有西比·伊兰戈斯的回答对我来说是不够的,所以我不得不:

右键单击资源文件 更改“Build Action”属性 编译为“嵌入式资源” 构建和部署

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


这是因为*。res不包含在迁移中。

右键单击资源文件 点击菜单项“Include in project”


This can be caused by mismatched namespaces. The second from top answer (Sibi Elango's) says to right-click the resx file, and change Build option to EmbeddedResource, but I had already done that and still had the error. The top answer (CFinck's) notes a way of fixing this via manually editing files, however, I had this problem in MonoDevelop, and had to set the default namespace to the same as the cs file which was calling for the resource (the file which contained code such as the code below)...

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

通过GUI设置默认名称空间后,上面的代码行不再引起异常。


在我的例子中,这个问题是由错误的类定义顺序引起的。例如,我在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到文件的末尾(更好的是将其移动到一个单独的文件),做项目清洁+重建解决了这个问题。


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


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

似乎没有人提到过这个解决方案。真的很明显——但有一瞬间绊倒了我……

新资源文件的默认访问修饰符是内部(或VB.Net中的朋友)。 请确保将此更改为Public

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


还有一个原因:如果您的名称空间有一个连字符(“-”),那么它将正确构建和运行,但资源将不可访问。名称空间(标识符)不应该有连字符,但除了在加载资源时,似乎没有在任何地方强制使用连字符。在过去的十年里,这已经让我痛苦了两次。


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


只是另一个案例。我用两个项目复制了一个解决方案,部分在Windows资源管理器中重命名它们(文件夹名,.sln和.csproj文件名),部分在Visual Studio中使用大量的查找和替换操作(名称空间等)。尽管如此,执行干事所说的例外情况仍然发生了。我发现程序集和命名空间名称仍然很旧。

虽然项目和其他所有内容都已命名为OfficeStyle,但程序集名称和默认名称空间仍然命名为Linckus。

在此修正之后,一切都恢复正常,编译并运行:)


我在运行迁移命令时遇到了这个问题。在包管理器控制台中更新数据库。

公认的答案并不能解决我的问题。

我不得不改变构建行动从编译到嵌入式资源,它为我工作。

你可以使用以下步骤做到同样的事情:

右键单击迁移。 将“Build Action”属性“Compile”更改为“Embedded Resource” 执行Update-Database命令。


对于在。net Core 3.0中遇到这个问题的用户,这可能与。net Core 3.0中的一个破坏性更改有关,要解决这个问题,只需在项目csproj中将EmbeddedResourceUseDependentUponConvention设置为false:

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

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


在我的情况下,资源文件的构建动作已经是嵌入式资源,但每次我运行update-database,我得到了相同的错误,所以我做了其他步骤,它是有效的:

将“生成操作”属性更改为“编译” 构建(有很多错误) 将“生成操作”属性更改回“嵌入式资源” - database就

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


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

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

在我的例子中,我试图将一个Form从一个项目迁移到另一个项目。结果我只忘记添加Form。Resx到新项目。在窗体中,我使用了一些图标,因此它依赖于资源。


在将Windows Forms csproj迁移到新的sdk风格的项目格式时,也会遇到这种异常。如果子文件夹中有任何窗体或用户控件,则*.;resx文件将使用包含子文件夹的名称空间生成,该名称空间可能与*. designer .cs名称空间不匹配。解决方案是在csproj中添加如下内容:

<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>

其他答案都不能帮我解决这个问题。我将许多窗体和控件从一个程序集移动到另一个程序集,修复了所有的名称空间,然后遇到了这个问题。

为了将移动的控件和表单与其他控件分开,我将它们放在一个子文件夹中。按照其他答案中的建议更新了一个资源引用。IDE警告我文件路径与名称空间不匹配,但这不是错误,所以我最初忽略了它。

当没有什么似乎可以修复它为我,我不知道有什么更好的尝试,我终于移动了他们的子文件夹的控件和形式(这不是在命名空间中表示),问题消失了。

显然,WinForms中仍然存在一些对文件夹结构的硬依赖。


对我来说是这样的。在MyStrings.Designer.cs文件中:

global::System.Resources.ResourceManager temp = 
    new global::System.Resources.ResourceManager(
      "MyApplication.MyProject", typeof(MyStrings).Assembly);

我以为MyApplication。MyProject引用类的命名空间,而不是文件的目录。我把文件放在一个名为Resources的子目录中,但名称空间没有反映这一点。

我把它改成

global::System.Resources.ResourceManager temp = 
    new global::System.Resources.ResourceManager(
      "MyApplication.MyProject.Resources", typeof(MyStrings).Assembly);

它成功了!(我甚至不需要更新名称空间!)