首页 文章

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

提问于
浏览
138

情况:

  • 我有一个名为 RT.Servers 的类库,包含一些资源(类型为 byte[] ,但重要的是't think that')

  • 同一个类库包含一个返回其中一个资源的方法

  • 我有一个简单的程序(带有对该库的引用),只调用该单个方法

我收到一条带有以下消息的 MissingManifestResourceException

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

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

17 回答

  • 221

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

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

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

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

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

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

  • 15

    解决此问题我需要做的就是右键单击解决方案资源管理器中的 Resources.resx 文件,然后单击“运行自定义工具” . 这会重新生成自动生成的 Resources.Designer.cs 文件 .

    如果.resx文件已手动添加到项目中,则必须将文件的“自定义工具”属性设置为“ResXFileCodeGenerator” .

    问题是由于命名空间不匹配,如果更改项目设置中程序集的"default namespace",则会出现这种情况 . (我把它从(先前) "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" . 我是手动完成的,但是运行自定义工具也可以做得很好 .

  • 2

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

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

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

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

    然后我发现上面的链接,说

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

    我把代理(我不会考虑"class definitions")放在该文件的底部,在本地命名空间之外,程序不再得到 MissingManifestResourceException . 真是个恼人的错误 . 但是,这似乎比修改自动生成的代码更强大的解决方案:)

  • 32

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

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

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

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

  • 11

    我有同样的问题,但使用运行自定义工具命令suggested by Timwi在我的情况下没有帮助 .

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

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

    我最好的猜测是,我在另一个应用程序中使用的库中有.resx . 我的应用程序没有自己的.resx文件,所以它必须使用库中的文件 - 只有当它嵌入库中时才可用,而不是"stand alone" .

  • 0

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

    • 构建动作: Embedded Resource

    • 复制到输出目录: Do not copy

    • 自定义工具: ResXFileCodeGenerator

    • 自定义工具命名空间: My.Project.S.Proper.Namespace

  • 0

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

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

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

    我没有得到实际的例外

    类型'System.Resources.MissingManifestResourceException'的第一次机会异常 .

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

    希望这对其他人有帮助 .

  • 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'."

  • 2

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

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

    • 如果是多个文件,请逐个右键单击资源文件 .

    • 确保,属性"Build Action"设置为"Embedded Resource" .

    而已! :)

  • 24

    我有同样的问题,但在我的情况下,我将一个类放在usercontrol中,这与usercontrol相关

    Public Class MyUserControlObject
    
    end Class
    
    Public Class MyUserCOntrol
    
    end Class
    

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

    Public Class MyUserCOntrol
    
    end Class
    
    Public Class MyUserControlObject
    
    end Class
    

    我希望这有帮助

  • 1

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

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

  • 2

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

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

  • 3

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

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

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

    一旦我做了第2步,例外就消失了 .

  • 1

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

  • -3

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

  • 1

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

  • 0

    来自the Microsoft support page

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

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

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

相关问题