162

情况:

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

我收到MissingManifestResourceException以下消息:

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

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

4

26 回答 26

257

解决此问题所需要做的就是右键单击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". 我手动完成了这项工作,但运行自定义工具同样可以做得很好。

于 2009-08-25T17:09:51.227 回答
38

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

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

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

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

然后我遇到了上面那个链接,上面写着

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

我将代表(我不会考虑“类定义”)放在该文件的底部,在本地命名空间之外,并且程序不再得到MissingManifestResourceException。多么令人恼火的错误。但是,这似乎是比修改自动生成的代码更强大的解决方案 :)

于 2009-09-02T14:36:53.727 回答
36

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

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

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

有关(稍微)更多信息,请参阅这篇文章

于 2010-12-01T12:50:13.623 回答
18

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

然而,它引导我走向正确的方向,因为我最终进入了.resx文件的属性。在这里,我注意到另一个没有引起问题的.resx文件的差异。

就我而言,我必须将属性“构建操作”从“资源”更改为“嵌入式资源”。

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

于 2010-09-08T09:58:23.640 回答
13

当我在 Vs 2012 中运行类似的问题时,结果发现 resx 文件的“自定义工具命名空间”属性是错误的(在我的情况下,实际上,它没有设置,所以生成的代码在运行时产生了这个异常) . 我的 resx 文件的最后一组属性是这样的:

  • 构建操作:嵌入式资源
  • 复制到输出目录:不要复制
  • 自定义工具:ResXFileCodeGenerator
  • 自定义工具命名空间:My.Project.S.Proper.Namespace
于 2014-08-22T07:53:36.760 回答
4

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

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

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

我没有得到一个实际的例外,只有

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

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

希望这可能对其他人有所帮助。

于 2015-02-18T19:56:30.560 回答
3

另请参阅:使用 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 文件,但该错误似乎仍然存在。

更新:资源(包括 XAML)的问题似乎与输出路径和正斜杠或反斜杠的使用有关,详见: 为什么修改项目输出目录导致:IOException 未处理“无法定位资源 'app.xaml' 。”

于 2012-12-19T15:02:31.987 回答
2

不确定它会帮助人们,但这个对我有用:

所以我遇到的问题是我收到以下消息:

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

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

我解决此问题的方法是将选项卡 Project->Properties->Resources 中的 Access Modifier 从“Internal”(只能在同一类库中访问)设置为“Public”(可从另一个类库访问)

然后运行并瞧瞧,对我来说不再有错误...

于 2014-01-30T06:25:48.680 回答
2

BlaM 给出的解决方案也对我有用。

我是 VS 2013 用户。在经历了许多修复但没有运气之后,我尝试了这个:

  1. 如果是多个文件,则一个接一个地右键单击资源文件。
  2. 确保将“构建操作”属性设置为“嵌入式资源”。

就是这样!:)

于 2016-08-10T18:09:50.717 回答
2

我有同样的问题,但在我的情况下,我在用户控件中放置了一个类,该类与用户控件相关,如下所示

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

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

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

我希望这有帮助

于 2016-08-12T09:03:24.130 回答
1

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

所以我删除了 resx 文件并重新生成了它们。现在一切都好。

于 2011-04-08T18:12:32.633 回答
1

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

我的问题是,当我从 WPF 项目中删除主窗口时(它没有主窗口),我忘记StartupUriApp.xaml. 我想如果您输入错误,可能会发生此异常StartupUri,因此如果有人遇到此问题,请检查您StartupUri的输入App.xaml

于 2016-01-08T09:15:01.777 回答
1

最近偶然发现了这个问题,就我而言,我做了一些事情:

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

  2. 确保程序集的默认命名空间(右键单击项目并选择属性)设置为与资源文件所在的命名空间相同。

一旦我完成了第 2 步,异常就消失了。

于 2018-01-26T03:06:41.393 回答
1

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

于 2019-05-06T18:10:37.633 回答
1

当您将新类放入设计器创建的表单类的源代码中时,也可能会发生相同的错误。

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

(至少在我的情况下这是问题......)

于 2019-11-13T10:58:23.823 回答
0

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

于 2013-04-29T03:37:49.277 回答
0

就我而言,我有一个带有资源的 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。

于 2018-01-24T12:14:57.917 回答
0

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

于 2018-04-27T08:32:26.240 回答
0

顺便提一下。如果您使用常量或文字,请确保它引用表单的资源ProjectName.Resources,而不是 cpntain Resources.resx

它可以为您节省一两个小时。

于 2019-05-08T18:36:08.737 回答
0

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

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

您必须更改RootNamespacevcxproj 文件中的条目以匹配 C++ 命名空间。

于 2019-09-27T15:00:17.540 回答
0

就我而言,这是从 Winforms 表单打开的窗口的 Xaml 中的错字:

不正确:<Image Source="/Resources/WorkGreen.gif"/>

正确:<Image Source="../Resources/WorkGreen.gif"/> 它可能对某人有帮助

于 2020-07-13T14:31:18.623 回答
0

就我而言,我已经更改了我的项目名称空间,因此我的解决方案是抛出“missingmanifestresourceexception”异常。

我没有在解决方案资源管理器中右键单击 .resx 文件并单击“运行自定义工具”选项,而是将 rootnamespace 替换为 .csproj 文件(RootNamespace)中的新命名空间并再次重建解决方案。

所有 Resources.Designer.cs 文件的命名空间都会自动更改为新的命名空间。

我希望我的回答对某人有所帮助。

于 2021-05-21T03:19:06.067 回答
0

如果您在使用 CMake 生成 C# 项目时遇到此问题,我找到的解决方案可能会对您有所帮助。

您的 CMakeLists.txt 文件需要

set_property(TARGET yourTargetName PROPERTY VS_GLOBAL_RootNamespace yourRootNamespace)

显然,用你自己的值代替yourTargetNameand 。yourRootNamespace

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

于 2021-09-01T14:01:50.297 回答
0

出现此错误的另一个原因是 - 从项目中排除了“.resx”文件。

就我而言,“.resx”文件已从项目中排除。

  1. 在解决方案资源管理器中选择“显示所有文件”选项。
  2. 右键单击“.resx”文件,然后单击包含在项目中。

重建项目/解决方案。

于 2021-12-07T03:43:06.697 回答
0

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

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

修复:您必须按顺序单独执行它们:代码文件->设计器文件->资源文件。然后它们被分组并且不再有错误,至少对我来说。

于 2022-02-04T21:23:36.447 回答
-3

Microsoft 支持页面

如果您使用通过使用具有不适当文件名的.resources 文件创建的附属程序集中存在的本地化资源,则会出现此问题。如果您手动创建附属程序集,通常会出现此问题。

若要解决此问题,请在运行 Resgen.exe 时指定 .resources 文件的文件名。在指定 .resources 文件的文件名时,请确保文件名以应用程序的命名空间名称开头。例如,在 Microsoft Visual Studio .NET 命令提示符处运行以下命令以创建一个 .resources 文件,该文件的文件名开头包含应用程序的命名空间名称:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
于 2009-08-25T11:45:37.060 回答