MissingManifestResourceException是什么意思以及如何解决它?

Tim*_*mwi 144 .net c# culture resources manifest

情况:

  • 我有一个名为的类库,RT.Servers包含一些资源(类型byte[],但我不认为这很重要)
  • 相同的类库包含一个返回其中一个资源的方法
  • 我有一个简单的程序(引用该库)只调用该单个方法

我收到MissingManifestResourceException以下消息:

找不到适合指定文化或中性文化的资源.确保"Servers.Resources.resources"在编译时正确嵌入或链接到程序集"RT.Servers",或者所有所需的附属程序集都是可加载和完全签名的.

我从来没有玩过文化,也没有集会签约,所以我不知道这里发生了什么.此外,这适用于使用相同库的另一个项目.有任何想法吗?

Tim*_*mwi 229

解决此问题我需要做的就是Resources.resx在解决方案资源管理器中右键单击该文件,然后单击"运行自定义工具".这会重新生成自动生成的Resources.Designer.cs文件.

如果.resx文件已手动添加到项目中,则必须将文件的"自定义工具"属性设置为"ResXFileCodeGenerator".

问题是由于命名空间不匹配,如果在项目设置中更改程序集的"默认命名空间",则会出现这种情况.(我把它从(先前)"Servers"改为(现在)"RT.Servers".)

在自动生成的代码中Resources.Designer.cs,有以下代码:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}
Run Code Online (Sandbox Code Playgroud)

必须将文字字符串"Servers.Resources"更改为"RT.Servers.Resources".我是手动完成的,但是运行自定义工具也可以做得很好.

  • 我爱你.:-) (12认同)
  • 这为我节省了很多时间! (7认同)
  • 如果您没有 resources.resx 文件怎么办? (3认同)
  • @AbeMiessler 是的..您转到属性,然后在其中看到 CustomTool 粘贴“ResXFileCodeGenerator”,然后右键单击解决方案资源管理器中的文件并运行自定义工具。我相信您已经弄清楚了,但供以后有需要的人参考:) (2认同)

Mar*_*off 34

我今天刚遇到这个问题,我发现这个Microsoft帮助和支持页面实际上解决了这个问题.

我在我的文件顶部,在全局命名空间中有几个代表,突然间我MissingManifestResourceException在运行程序时得到了一个代码:

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
Run Code Online (Sandbox Code Playgroud)

然后我将代理移动到命名空间,得到了同样的错误.最后,我将委托放在该文件中唯一的类中,错误消失了,但我不希望该类或命名空间中的委托.

然后我发现上面的链接,说

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

我把代理(我不会考虑"类定义")放在该文件的底部,在本地命名空间之外,程序不再得到它MissingManifestResourceException.真是个恼人的错误.但是,这似乎比修改自动生成的代码更强大的解决方案:)

  • 由于在Form1.cs文件中的Form类上面添加了一个类,我得到了错误(如您提供的链接的"Resolution"部分所述).谢谢! (7认同)

Mot*_*tti 29

我遇到了类似的问题,虽然我知道它不是OP的原因,但我会在这里发布,以便如果其他人在将来遇到这个问题,我们将会提供答案.

如果在设计器类之前添加一个类,则会MissingManifestResourceException在运行时获得异常(无编译时错误或警告),因为

Visual Studio要求设计人员使用文件中的第一个类.

有关(稍微)更多信息,请参阅此帖子.

  • 感谢您发布此"答案".尽管相对于OP的问题它是"偏离主题",但在这里发布它是一个好主意.搜索MissingManifestResourceException导致我进入这个主题,你的答案就是我的问题. (11认同)
  • 同上 - 感谢您花时间在这里发布! (3认同)

Bla*_*laM 15

我有同样的问题,但使用Timwi建议运行自定义工具命令对我的情况没有帮助.

然而,它带领我进入正确的方向,因为我在结束了属性的中的.resx文件.在这里,我注意到另一个.resx文件的区别,没有引起任何问题.

在我的情况下,我不得不将属性"Build Action"从"Resource"更改为"Embedded Resource".

我最好的猜测是,我在另一个应用程序中使用的库中有.resx.我的应用程序没有自己的.resx文件,因此它必须使用库中的文件 - 只有当它嵌入库中时才可用,而不是"独立".

  • +1谢谢,我仔细检查了我的资源文件,这些文件也位于其他应用程序引用的单独库中.我将Build Action设置为Content,在将其更改为Embedded Resource后,一切运行良好.愚蠢的疏忽 (2认同)
  • 谢谢!这对我有用,我有一些文本文件包含用于测试或一些业务映射规则的内容。从内容更改为嵌入式资源解决了问题。 (2认同)

Sta*_*opo 11

当我在类似的问题中运行时,在Vs 2012中,结果是resx文件的"自定义工具命名空间"属性是错误的(在我的情况下,实际上,它是未设置的,因此生成的代码在运行时发出此异常) .我对resx文件的最后一组属性是这样的:

  • 构建操作:嵌入式资源
  • 复制到输出目录:不要复制
  • 自定义工具:ResXFileCodeGenerator
  • 自定义工具命名空间:My.Project.S.Proper.Namespace


nie*_*ras 5

另请参阅:使用 MSBuild 构建后运行测试时出现 MissingManifestResourceException(.mresource 在清单中具有路径)

为了完整起见,我在这里重复答案:

看来将 LogicalName 添加到项目文件中可以解决此问题:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
Run Code Online (Sandbox Code Playgroud)

即项目文件中的嵌入资源条目如下所示:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

详细信息请参阅:http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

请注意,我们使用的是 .resx 文件,但该错误似乎仍然出现。

更新:资源(包括 XAML)的问题似乎与输出路径以及正斜杠或反斜杠的使用有关,详细信息请参阅: Why does修改项目输出目录导致:IOException was unhandled“无法找到资源'app.xaml' ”。


big*_*oot 5

我遇到了这个问题的另一个原因,它与 resx 文件无关。我有一个类库,其中 AssemblyInfo.cs 包含以下内容:

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]
Run Code Online (Sandbox Code Playgroud)

该程序集不包含任何 WPF 代码、主题或资源字典。我通过删除 ThemeInfo 属性摆脱了异常。

我没有得到真正的异常,只是

“System.Resources.MissingManifestResourceException”类型的第一次机会异常。

查看异常详细信息,系统正在请求 MyAssembly.g.resources