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


151

情况:

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

我收到MissingManifestResourceException以下消息:

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

我从来没有玩过文化或程序集签名,所以我不知道这里发生了什么。同样,这在使用相同库的另一个项目中也有效。有任何想法吗?


2
这是.NET中最无用的异常之一。它在至少3个没有任何共同点的场景中触发。
rr-

1
抱歉,但这是Microsoft的方式:删除所有内容,然后再次添加。适用于资源,NUGET,引用和连接字符串。有很多工具,但是在非常

Answers:


238

解决此问题所需要做的就是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"。我是手动完成的,但是运行自定义工具也可以做到。


9
这节省了我很多时间!
埃里克

1
+1!在VS 2010中,至少对于WinForms,上面显示的ResourceManager文字字符串会自动更新为项目属性(“应用程序”选项卡)中的“默认命名空间”值。
TrueWill

2
如果没有resources.resx文件怎么办?
ashes999 2011年

@ ashes999:您是否查看过Properties文件夹?至少在C#项目中通常是这样。
RenniePet 2012年

我遇到了同样的问题。.resx文件是手动添加到项目中的,我将文件的“自定义工具”属性设置为“ ResXFileCodeGenerator”。然后,resx文件是第一个,后来是designer.vb文件。Actullydesinger文件是第一个,更高的.resx文件。我该怎么做....
Kavitha

37

我今天刚遇到此问题,并且发现此Microsoft帮助和支持页面实际上确实可以解决该问题。

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

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

然后,我将委托移到名称空间中,出现相同的错误。最后,我将委托置于该文件中的唯一类中,错误消失了,但是我不希望该委托位于该类或名称空间中。

然后我遇到了上面的那个链接

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

我将委托(我不认为是“类定义”)放在该文件的底部,本地名称空间之外,并且程序MissingManifestResourceException不再可用。多么令人讨厌的错误。但是,这似乎比修改自动生成的代码更可靠:)


感谢您的回答。听起来您遇到了引起相同症状的其他问题。我的代码中没有任何额外的类,实际上我什至没有任何形式。我应该编辑以前的答案,因为我发现我实际上不需要修改自动生成的代码。我可以只重新运行代码生成器,它本身就会修复。不知道为什么构建过程没有自动执行。
Timwi

7
由于在Form1.cs文件中的Form类之上添加了一个类而导致出现错误(如您提供的链接的“解决方案”部分所述)。谢谢!
马特·史密斯

同样的问题; 没有其他工作,所以我只删除了这一行:this.Icon =((System.Drawing.Icon)(resources.GetObject(“ $ this.Icon”)))); '因为我不在乎那种特殊形式的图标:)
Gary Huckabone

那就是答案。谢谢。
瑟坦·佩克尔

如果有人感到困惑,我在Form1.cs的“ Form1”位之前有一个叫做“ StringExtensions”的类,我将其移到了Form1的Form1.cs下方,而不是上方,并且有效
Ma Dude

31

我遇到了类似的问题,尽管我知道这不是OP造成的原因,但我将其张贴在这里,以便将来如果其他人遇到此问题,将可以找到答案。

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

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

有关(少量)更多信息,请参阅此文章


12
感谢您发布此“答案”。尽管相对于OP的问题而言,它是“离题的”,但将其张贴在此处是个好主意。对MissingManifestResourceException的搜索将我带到了这个线程,而您的答案恰恰是我的问题。
RenniePet

16

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

但是,它使我朝着正确的方向前进,因为我最终进入了.resx文件的属性。在这里,我注意到与另一个.resx文件的不同之处,没有引起任何问题。

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

最好的猜测是,我在另一个应用程序使用的库中保存了.resx。我的应用程序没有自己的.resx文件,因此它必须使用库中的文件-仅当将其嵌入库中并且不是“独立”时才可用。


2
+1,谢谢,我仔细检查了我的资源文件,这些文件也位于其他应用程序引用的单独库中。我将“构建操作”设置为“内容”,并将其更改为“嵌入式资源”后,一切运行良好。愚蠢的疏忽
Shan Plourde

1
谢谢!在我有一些文本文件包含测试或某些业务映射规则的内容的情况下,这对我有用。从内容更改为嵌入式资源可解决此问题。
S. Baggy 2013年

12

当我在类似的问题中运行时,在Vs 2012中,事实证明resx文件的“自定义工具命名空间”属性是错误的(在我的情况下,实际上是未设置的,因此生成的代码在运行时产生了此异常) 。我对resx文件的最后一组属性是这样的:

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

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' ”。


经过大约八个小时的调试,并逐字浏览了所有github,SO和Google的答案,这才解决了我的问题...再次,从.Net 3.5迁移到4.7.2之后,我的问题开始发生。
内维尔,

3

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

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

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

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

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

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

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


2
这次真是万分感谢!正是我需要的解决方案!在不小心将ViewModel项目创建为控件库时发生。
安德鲁·汉隆,2015年

谢谢。这为我解决了。
Jamleck

2

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

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

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

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

我要解决的问题是将“项目”->“属性”->“资源”选项卡中的“访问修饰符”从“内部”(仅可在同一类库中访问)设置为“公共”(可从另一个类库访问)

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


2

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

我是VS 2013用户。经过许多修复但没有运气之后,我尝试了以下方法:

  1. 如果有多个文件,则右键单击资源文件。
  2. 确保将属性“ Build Action”设置为“ Embedded Resource”。

而已!:)


确认这一点。我有一个正在运行的项目,但需要分别维护资源程序集,因此尝试从“嵌入式资源”切换为简单的“资源”,并最终得到MissingResourceManifestException。
Mosca Pt

2

我有同样的问题,但就我而言,我将一个类放置在与此类用户控件相关的用户控件中

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

解决方案是将MyUserControlObject此类移至Usercontrol类的末尾

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

我希望这有帮助


讨论糟糕的错误描述...我在主窗体的CS文件中添加了一个帮助器类。我永远都不会想到错误消息将链接回此。谢谢!
亚当·刘易斯

1

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

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


1

最近遇到了同样的问题,挣扎了一下,发现了这个话题,但没有答案适合我。

我的问题是,当我从我的WPF项目中删除主窗口(它没有一个主窗口),我忘了删除StartupUriApp.xaml。我想如果您输入有误,可能会发生此异常StartupUri,因此,如果有人在为此苦苦挣扎,请检查您的StartupUri输入App.xaml


1

最近偶然发现了这个问题,以我为例,我做了几件事:

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

  2. 确保Assembly的默认名称空间(右键单击项目,然后选择Properties)设置为与资源文件所在的名称空间相同。

完成步骤2后,异常消失了。


1

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


1

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

可以删除此新类,并将其放在其他CS文件中。

(至少就我而言,这就是问题所在...)


0

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


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版本。


0

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


0

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

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


0

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

该解决方案很简单,但其他地方未提及。

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


0

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

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

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


-3

Microsoft支持页面

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

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

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

1
感谢您的答复,但我不知道ResGen.exe是什么,我从未使用过它,并且坦率地说,我不想使用它,因为我没有尝试使用任何花哨的东西。当然,必须有一种方法可以从Visual Studio中解决此问题吗?例如,既然您说资源是“本地化的”,那么如何将资源声明为非本地化的?再次感谢。
Timwi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.