MissingManifestResourceException 是什么意思以及如何修复它?

情况:

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

我收到一个 MissingManifestResourceException,上面有如下信息:

找不到任何资源 适用于指定区域性的 或者中立的文化,确认一下 “服务器,资源,资源”是 正确地嵌入或连接到 在编译时汇编“ RT.Servers”, 或者所有的卫星组件 所要求的是可装载和充分 签了。

我从来没有玩文化,或集会签署,所以我不知道这里发生了什么。此外,这在另一个使用相同库的项目中也可以工作。有什么想法吗?

141893 次浏览

来自 微软支持页面:

方法创建的附属程序集中存在的本地化资源将发生此问题。具有不适当文件名的资源文件。如果手动创建附属程序集,通常会出现此问题。

若要解决此问题,请指定。运行 Resgen.exe 时的资源文件。控件的文件名。请确保文件名以应用程序的命名空间名称开头。例如,在 MicrosoftVisualStudio 中运行以下命令。NET 命令提示符来创建。将应用程序的命名空间名称放在文件名开头的 resources 文件:

Resgen strings.CultureIdentifier.resx
MyApp.strings.CultureIdentifier.resources

要解决这个问题,我所需要做的就是在解决方案资源管理器中右键单击 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;
}
}

字符串 "Servers.Resources"必须更改为 "RT.Servers.Resources"。我手动完成了这项工作,但是运行自定义工具同样可以很好地完成这项工作。

我今天碰到了这个问题,我发现 此 Microsoft 帮助和支持页确实解决了这个问题。

我在文件顶部的全局名称空间中有几个委托,在运行程序时,突然我得到一个 MissingManifestResourceException,在下面这行:

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

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

然后我看到了上面的链接

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

我将委托(我不认为是“类定义”)放在本地名称空间之外的文件底部,程序不再获得 MissingManifestResourceException。多么恼人的错误。但是,与修改自动生成的代码相比,这似乎是一个更健壮的解决方案:)

我有同样的问题,但使用 运行自定义工具命令作为 由 Timwi 建议在我的情况下没有帮助。

然而,它引导我进入正确的方向,因为我最终在 。雷斯克斯文件的 物业。在这里,我注意到与另一个 。雷斯克斯文件的不同之处,它没有引起任何问题。

在我的示例中,我必须将属性“ BuildAction”从“ Resource”更改为“嵌入式资源”。

对于这个原因,我最好的猜测是,我在一个从另一个应用程序使用的库中使用了 。雷斯克斯。我的应用程序没有自己的 。雷斯克斯文件,所以它必须使用库中的 。雷斯克斯文件——只有当它嵌入到库中而不是“独立”时才可用。

我遇到过类似的问题,尽管我知道这不是 OP 的原因,但我还是将它贴在这里,以便将来如果有人遇到这个问题,就可以得到答案。

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

VisualStudio 要求设计器使用文件中的第一个类。

更多信息参见 这篇文章

在将项目从 VS2005移植到 VS2010之后,我得到了 MissingManifestResourceException 错误。在包含 Form 类的文件中没有定义任何其他类。我还正确地设置了 resx 资源文件名。没用。

所以我删除了 resx 文件并重新生成了它们,现在没事了。

另见: 在使用 MSBuild 生成后运行测试时发生 MissingManifestResourceException (. mresource 在清单中有路径)

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

将 LogicalName 添加到项目文件中似乎可以修复它:

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName>

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

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

详见: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

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

更新: 资源的问题(包括。XAML)似乎与输出路径和正向或反向斜杠的使用有关,详见:

因为我正在预编译我的 Web 应用程序(使用 VS2012发布特性)。我得到了上面的错误。我尝试了所有的建议,但是奇怪地把“构建操作”改成了“内容”!

不确定它是否能帮助人们,但这个对我很有用:

所以我的问题是,我得到了以下信息:

找不到任何适合指定区域性或非特定区域性的资源。确保“我的”。资源。“ Resources.resources”在编译时正确嵌入或链接到程序集“ X”中,或者所需的所有附属程序集都是可加载和完全签名的

我试图从另一个类库中获取嵌入到项目中的资源。

为了解决这个问题,我在选项卡 Project-> Properties-> Resources from“ Internal”(只能在同一个类库中访问)中将 Access 修饰符设置为“ Public”(可从另一个类库访问)

那就跑吧,我不会再犯错了。

当我在 VS 2012中运行类似的问题时,结果发现 resx 文件的“ Custom Tool Namespace”属性是错误的(在我的例子中,它实际上是未设置的,所以生成的代码在运行时产生了这个异常)。 我对 resx 文件的最后一组属性是这样的:

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

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

[assembly: ThemeInfo(
ResourceDictionaryLocation.SourceAssembly,
ResourceDictionaryLocation.SourceAssembly)]

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

我没有得到一个真正的例外,只有

类型为‘ System.Resources.MissingManifestResourceException’的第一次机会异常。

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

希望这能帮到其他人。

最近碰到了同样的问题,挣扎了一下,发现这个话题却没有答案对我来说是正确的。

我的问题是,当我从 WPF 项目中删除主窗口时(它没有主窗口) ,我忘记从 App.xaml中删除 StartupUri。我想这个异常可能会发生,如果你有一个错误的 StartupUri,所以如果有人在这方面挣扎-检查你的 StartupUriApp.xaml

布拉姆给出的解决方案对我也有效。

我是一个 VS 2013用户。经过许多修复,但没有运气,我尝试这样:

  1. 对于多个文件,右键单击资源文件,一个接一个。
  2. 确保属性“ BuildAction”设置为“嵌入式资源”。

就是这样! :)

我也有同样的问题,但是在我的例子中,我在用户控件中放置了一个类,这个类与用户控件相关,如下所示

Public Class MyUserControlObject


end Class


Public Class MyUserCOntrol


end Class

解决方案是将 MyUserControlObject移动到 Usercontrol 类的末尾,如下所示

Public Class MyUserCOntrol


end Class


Public Class MyUserControlObject


end Class

希望这个能帮上忙

在我的例子中,我有一个带有资源的 web api,并用它创建了一个 nuget 包。当我在其他项目中使用这个 nuget 时,我意识到当我请求一个具有资源的 api 时,经过一些研究,我得到的是 MissingManifestResourceException,我了解到 nuget 包装器不会自动打包资源。如果要使用资源文件,则必须手动执行此操作。因此,您需要将下面的行添加到。Nuspec 文件: (请浏览 https://github.com/NuGet/Home/issues/1482)

<package>
<metadata>
</metadata>
<files>
<file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
<file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
</files>
</package>

但是,在添加文件之前,您需要确定使用的是哪个版本的.net。

最近偶然发现了这个问题,在我的情况下,我做了一些事情:

  1. 确保 resx 文件的 Designer.cs 文件中的名称空间是一致的

  2. 确保 Assembly 的默认命名空间(右键单击项目并选择 Properties)与资源文件所在的命名空间相同。

一旦我执行了第2步,异常就消失了。

我有一个新创建的 F # 项目。 解决方案是在项目属性-> 应用程序-> 资源/指定如何管理应用程序资源中取消选中“使用标准资源名称”。 如果您没有看到复选框,那么更新您的 VisualStudio!我已经安装了15.6.7。在15.3.2中,没有这个复选框。

当我在文件中添加另一个类时,我遇到了这个问题,就在从 Form 派生的类之前。修复问题后再添加。

顺便说一句。如果使用常量或文字,请确保它引用形式为 ProjectName.Resources的资源,并且不包含 Resources.resx

可以帮你节省一两个小时。

在重命名全局名称空间(不是手动命名,而是使用 VS2017的重命名工具)之后,我在基于 WinForms 的托管 C + + 项目中遇到了这个问题。

解决方案很简单,但在其他地方没有提到。

您必须更改 vcxproj-file 中的 RootNamespace条目以匹配 C + + 名称空间。

在将新类放入设计器创建的窗体的类的源代码中时,也可能发生同样的错误。

这个新类可能会被删除,并放置在一个不同的 cs 文件中。

(至少对我来说,这就是问题所在... ...)

在我的案例中,这是一个从 Winform 打开的窗口的 Xaml 输入错误:

错误: <Image Source="/Resources/WorkGreen.gif"/>

正确: <Image Source="../Resources/WorkGreen.gif"/> 也许能帮到别人

在我的例子中,我已经更改了我的项目名称空间,因此我的解决方案抛出了“ missingManifresource 异常”异常。< br/> < br/> 而不是右键单击。在解决方案资源管理器中的 resx 文件,并单击“运行自定义工具”选项,我已经替换了 中的新命名空间。Csproj 文件(RootNamespace)并再次重新生成解决方案。< br/> < br/> 所有资源。Cs 文件的名称空间被自动更改为新的名称空间。< br/> < br/> 我希望我的回答能帮到某人。

如果您是在使用 CMake 生成 C # 项目时获得这些信息的,那么我找到的解决方案可能会对您有所帮助。

您的 CMakeLists.txt 文件需要

set_property(TARGET yourTargetName PROPERTY VS_GLOBAL_RootNamespace yourRootNamespace)

很明显,用你自己的值代替 yourTargetNameyourRootNamespace

然后资源将嵌入到您的程序集中!

获得此错误的另一个原因是-‘ . resx’文件被排除在 project 之外。

在我的例子中,“ . resx”文件被排除在项目之外。

  1. 在解决方案资源管理器中选择“显示所有文件”选项。
  2. 右键单击“ . resx”文件并单击 project 中的 include。

重新构建项目/解决方案。

我读了所有的答案,没有一个对我有用。很可能我的情况不同,但是同样的错误。我的问题是我有两个项目。第二个项目添加了很多表单,从第一个作为“添加为链接”。

对于 WinForms,有3个必需的文件: 代码、设计器和资源文件。如果您同时添加所有3个文件作为“添加为链接”,则 VisualStudio 不会将它们作为同一表单链接在一起。它会编译并运行,但是会因为相同的 MissingManifestResourceException 错误而崩溃。

解决方案: 必须按照以下顺序逐个执行: 代码文件—— > 设计器文件—— > 资源文件。然后他们被分组,没有更多的错误,至少对我来说。