我有两个ASP。NET Web项目(ProjectA和projecb)。当ProjectA中的类正在实例化ProjectB中的一个类时,它使用了一个资源文件Blah。resx,我得到这个错误:

一个System.Resources类型的异常。mscorlib.dll中出现了MissingManifestResourceException',但在用户代码中没有处理。 无法找到适用于指定区域性或中性区域性的任何资源。确保“资源。等等。”资源“正确嵌入或链接到程序集”App_GlobalResources。Sn_flri6”,或者所有所需的附属程序集都是可加载的并具有全符号。

是什么导致的?

在微软的网站上有一篇关于http://support.microsoft.com/kb/318603的文章,它建议:

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

这是一个Windows窗体项目的解决方案,我不确定这是否也适用于Web项目。


当前回答

还有一个原因:如果您的名称空间有一个连字符(“-”),那么它将正确构建和运行,但资源将不可访问。名称空间(标识符)不应该有连字符,但除了在加载资源时,似乎没有在任何地方强制使用连字符。在过去的十年里,这已经让我痛苦了两次。

其他回答

我在运行迁移命令时遇到了这个问题。在包管理器控制台中更新数据库。

公认的答案并不能解决我的问题。

我不得不改变构建行动从编译到嵌入式资源,它为我工作。

你可以使用以下步骤做到同样的事情:

右键单击迁移。 将“Build Action”属性“Compile”更改为“Embedded Resource” 执行Update-Database命令。

谢谢@CFinck ! 只是给其他人添加一个提示:我用这个改变了ResourceManager行:

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

我在vb.net,但我认为在c#中唯一的区别是+而不是&连接字符串。

这样,我就可以在两个共享资源的类似项目中使用相同的链接程序集文件。

在我的例子中,我试图将一个Form从一个项目迁移到另一个项目。结果我只忘记添加Form。Resx到新项目。在窗体中,我使用了一些图标,因此它依赖于资源。

在将Windows Forms csproj迁移到新的sdk风格的项目格式时,也会遇到这种异常。如果子文件夹中有任何窗体或用户控件,则*.;resx文件将使用包含子文件夹的名称空间生成,该名称空间可能与*. designer .cs名称空间不匹配。解决方案是在csproj中添加如下内容:

<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>

我只是在WPF项目中碰到了同样的异常。问题发生在我们最近移动到另一个名称空间(ProblemAssembly)的程序集中。支持ProblemAssembly.Controls)。试图从程序集中存在的第二个资源文件访问资源时发生异常。

事实证明,附加的资源文件没有正确地将引用从旧的名称空间名称移动到新的名称空间名称。

在资源文件的designer.cs中,有一个静态属性用于获取ResourceManager。在该getter中,字符串仍然引用旧的名称空间。一旦将其纠正为新的名称空间,问题就解决了:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

本来应该是:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);