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

时间:2009-08-25 11:33:10

标签: c# .net resources manifest culture

情况:

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

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

  

无法找到任何资源   适合指定的文化   或中性文化。确保   “Servers.Resources.resources”是   正确嵌入或链接到   汇编“RT.Servers”在编译时,   或所有卫星组件   必需的是可加载的和完全的   签名。

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

23 个答案:

答案 0 :(得分:222)

我需要做的就是解决此问题的方法是右键单击解决方案资源管理器中的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 :(得分:33)

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

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

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

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

然后我遇到了上面的链接,其中说了

  

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

我把代理(我不会考虑“类定义”)放在该文件的底部,在本地命名空间之外,程序不再获得MissingManifestResourceException。真是个恼人的错误。但是,这似乎比修改自动生成的代码更有效:)

答案 2 :(得分:25)

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

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

  

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

有关(稍微)更多信息,请参阅this post

答案 3 :(得分:15)

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

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

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

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

答案 4 :(得分:11)

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

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

答案 5 :(得分:3)

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

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

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

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

  

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

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

希望这对其他人有帮助。

答案 6 :(得分:2)

另见: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'."

答案 7 :(得分:2)

我遇到了同样的问题,但在我的情况下,我将一个类放在一个usercontrol中,它与usercontrol有关,就像这样

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

解决方案是将MyUserControlObject移动到Usercontrol类的末尾,就像这样

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

我希望这会有所帮助

答案 8 :(得分:2)

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

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

  

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

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

我为修复此问题所做的是将选项卡Project-&gt; Properties-&gt; Resources中的Access Modifier从“Internal”(只能在同一个类库中访问)设置为“Public”(可从另一个类访问)库)

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

答案 9 :(得分:2)

BlaM给出的解决方案也适用于我。

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

  1. 如果是多个文件,请逐个右键单击资源文件。
  2. 确保将“Build Action”属性设置为“Embedded Resource”。
  3. 就是这样! :)

答案 10 :(得分:1)

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

我的问题是,当我从WPF项目中删除主窗口时(它没有主窗口),我忘记从StartupUri删除App.xaml。我想如果你在StartupUri中犯了错误就会发生这种异常,所以如果有人在努力解决这个问题 - 请检查StartupUri中的App.xaml

答案 11 :(得分:1)

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

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

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

  3. 一旦我做了第2步,异常就消失了。

答案 12 :(得分:1)

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

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

答案 13 :(得分:0)

因为我正在预编译我的Web应用程序(使用VS2012发布功能)。我收到了上面的错误。我尝试了所有的建议,但奇怪的是将“Build Action”改为“Content”就行了!

答案 14 :(得分:0)

就我而言,我有一个带有资源的web api,我从中创建了一个nuget包。当我在其他项目中使用这个nuget时,我意识到当我使用资源请求api时,我在经过一些研究后得到MissingManifestResourceException,我知道nuget packager没有自动打包资源。如果要使用资源文件,则必须手动执行此操作。因此,您需要在.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版本。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

仅此而已。如果使用常量或文字,请确保其引用格式为ProjectName.Resources的资源,并且不包含Resources.resx

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

答案 18 :(得分:0)

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

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

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

答案 19 :(得分:0)

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

此新类可能已删除,并放置在其他cs文件中。

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

答案 20 :(得分:0)

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

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

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

答案 21 :(得分:0)

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

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

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

希望我的回答能帮到人。

答案 22 :(得分:-3)

来自the Microsoft support page

  

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

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

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