【问题标题】:What does MissingManifestResourceException mean and how to fix it?MissingManifestResourceException 是什么意思以及如何解决它?
【发布时间】:2010-11-22 14:20:37
【问题描述】:

情况:

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

我收到了一个MissingManifestResourceException,其中包含以下消息:

找不到任何资源 适用于指定的文化 或中立文化。确保 “Servers.Resources.resources”原为 正确嵌入或链接到 在编译时组装“RT.Servers”, 或者所有的卫星组件 required 是可加载且完全的 签名。

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

【问题讨论】:

  • 这是 .NET 中最无用的异常之一。它会在至少 3 个没有共同点的场景中触发。
  • 抱歉,这是微软的方式:全部删除,然后重新添加。适用于资源、NUGET、引用和连接字符串。有很多工具,但是在非常规的情况下你会花时间处理原始文件......

标签: c# .net resources manifest culture


【解决方案1】:

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

【讨论】:

  • 这为我节省了很多时间!
  • +1!在 VS 2010 中,上面显示的 ResourceManager 文字字符串会自动更新为项目属性(应用程序选项卡)中默认命名空间的值,至少对于 WinForms。
  • 如果没有 resources.resx 文件怎么办?
  • 我正在运行 Visual Studio 2013,右键单击时没有“运行自定义工具”。关于这个人可能藏在哪里的任何建议?
  • @AbeMiessler 好吧.. 你去属性那里你会看到 CustomTool 粘贴“ResXFileCodeGenerator”并右键单击解决方案资源管理器中的文件并运行自定义工具。我相信您已经弄清楚了,但供将来有需要的人参考:)
【解决方案2】:

我今天刚遇到这个问题,我发现 this Microsoft Help and Support page 确实解决了这个问题。

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答。这听起来像你有一个不同的问题导致相同的症状。我的代码中没有任何额外的类,实际上我什至根本没有任何形式。我应该编辑我之前的答案,因为我发现我实际上不需要修改自动生成的代码。我本可以重新运行代码生成器,它会自行修复。不知道为什么构建过程没有自动完成。
  • 由于在 Form1.cs 文件中的表单类上方添加了一个类(如您提供的链接的“解决方案”部分中所述),我收到了错误。谢谢!
  • 同样的问题;没有其他工作,所以我只是删除了这一行: this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));因为我不在乎那个特定形式的图标:)
  • 这就是答案。谢谢。
  • 如果有人感到困惑,我在 Form1.cs 的“Form1”位之前有一个名为“StringExtensions”的类,我将它移到 form1.cs 中的 Form1 下方而不是上方,它起作用了
【解决方案3】:

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

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

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

如需(略)更多信息,请参阅this post

【讨论】:

  • 感谢您发布此“答案”。尽管相对于 OP 的问题它是“离题”,但将其发布在这里是一个好主意。对 MissingManifestResourceException 的搜索将我带到了这个线程,你的答案对我的问题很准确。
【解决方案4】:

我遇到了同样的问题,但使用 Run Custom Tool 命令作为suggested by Timwi 对我的情况没有帮助。

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

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

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

【讨论】:

  • +1 谢谢,我仔细检查了我的资源文件,这些文件也位于其他应用程序引用的单独库中。我将 Build Action 设置为 Content,将其更改为 Embedded Resource 后,一切正常。愚蠢的疏忽
  • 谢谢!这对我有用,因为我有一些包含测试内容或一些业务映射规则的文本文件。从内容更改为嵌入式资源解决了这个问题。
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢你!正是我需要的修复!当您不小心将 ViewModel 项目创建为控件库时会发生这种情况。
    • 谢谢。这为我解决了问题。
    【解决方案7】:

    另见:MissingManifestResourceException when running tests after building with MSBuild (.mresource has path in manifest)

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

    似乎将 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)的问题似乎与输出路径和使用正斜杠或反斜杠有关,详见: Why does modifying project output directories cause: IOException was unhandled "Cannot locate resource 'app.xaml'."

    【讨论】:

    • 在调试了这个问题大约 8 小时后,从字面上浏览了每一个 github、SO 和 Google 的答案,这就是解决我问题的答案...... fwiw,我的问题在从 .Net 迁移后开始发生3.5 到 4.7.2。
    【解决方案8】:

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

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

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

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

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

    然后运行,瞧,我没有更多错误......

    【讨论】:

      【解决方案9】:

      BlaM 提供的解决方案也对我有用。

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

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

      就是这样! :)

      【讨论】:

      • 确认。我有一个工作项目,但需要单独维护资源程序集,因此尝试从“嵌入式资源”切换到简单的“资源”,最终得到 MissingResourceManifestException。
      【解决方案10】:

      我遇到了同样的问题,但在我的情况下,我在用户控件中放置了一个类,该类与这样的用户控件相关

      Public Class MyUserControlObject
      
      end Class
      
      Public Class MyUserCOntrol
      
      end Class
      

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

      Public Class MyUserCOntrol
      
      end Class
      
      Public Class MyUserControlObject
      
      end Class
      

      希望对你有帮助

      【讨论】:

      • 谈论一个糟糕的错误描述......我在主窗体的 CS 文件中添加了一个帮助程序类。我永远不会猜到错误消息会链接回这个。谢谢!
      【解决方案11】:

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

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

      【讨论】:

        【解决方案12】:

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

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

        【讨论】:

          【解决方案13】:

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

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

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

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

          【讨论】:

            【解决方案14】:

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

            【讨论】:

              【解决方案15】:

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

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

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

              【讨论】:

                【解决方案16】:

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

                【讨论】:

                  【解决方案17】:

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

                  【讨论】:

                    【解决方案18】:

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

                    【讨论】:

                      【解决方案19】:

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

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

                      【讨论】:

                        【解决方案20】:

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

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

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

                        【讨论】:

                          【解决方案21】:

                          在我的情况下,这是从 Winforms 表单打开的窗口的 Xaml 中的错字:

                          不正确:&lt;Image Source="/Resources/WorkGreen.gif"/&gt;

                          正确:&lt;Image Source="../Resources/WorkGreen.gif"/&gt; 它可能会帮助某人

                          【讨论】:

                            【解决方案22】:

                            在我的例子中,我更改了我的项目命名空间,因此我的解决方案是抛出“missingmanifestresourceexception”异常。

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

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

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

                            【讨论】:

                              【解决方案23】:

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

                              您的 CMakeLists.txt 文件需要

                              set_property(TARGET yourTargetName PROPERTY VS_GLOBAL_RootNamespace yourRootNamespace)

                              显然,用您自己的值替换 yourTargetNameyourRootNamespace

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

                              【讨论】:

                                【解决方案24】:

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

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

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

                                重建项目/解决方案。

                                【讨论】:

                                  【解决方案25】:

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

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

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

                                  【讨论】:

                                    【解决方案26】:

                                    来自the Microsoft support page

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

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

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

                                    【讨论】:

                                    • 感谢您的回复,但是我不知道ResGen.exe是什么,我从来没有使用过,坦率地说我不想使用它,因为我没有尝试使用任何花哨的东西。当然必须有一种方法可以从 Visual Studio 解决这个问题?例如,既然您说资源是“本地化的”,那么我如何将资源声明为非本地化?再次感谢。
                                    猜你喜欢
                                    • 2013-08-04
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2020-04-22
                                    • 2010-10-08
                                    • 2021-06-25
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多