我有两个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项目。


当前回答

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

其他回答

在我的例子中,这些代码行添加到Web。Config帮了大忙:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

连同构建动作:嵌入式资源和自定义工具:PublicResXFileCodeGenerator。

仅仅因为您引用了项目B的DLL,并不意味着项目A的资源管理器知道项目B的App_GlobalResources目录。

您使用的是网站项目还是web应用程序项目?在后者中,Visual Studio应该允许您链接源代码文件(不确定前者,我从未使用过它们)。这是一个鲜为人知但很有用的特性,下面将对其进行描述。这样,您就可以将项目B资源文件链接到项目A。

This can be caused by mismatched namespaces. The second from top answer (Sibi Elango's) says to right-click the resx file, and change Build option to EmbeddedResource, but I had already done that and still had the error. The top answer (CFinck's) notes a way of fixing this via manually editing files, however, I had this problem in MonoDevelop, and had to set the default namespace to the same as the cs file which was calling for the resource (the file which contained code such as the code below)...

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

通过GUI设置默认名称空间后,上面的代码行不再引起异常。

对我来说,问题是将.resx文件和相关联的.cs文件从一个项目复制到另一个项目。两个项目都有相同的名称空间,所以这不是问题。

当我在解决方案资源管理器中注意到原始项目中的.resx文件依赖于.cs文件时,终于解决了这个问题:

MyResource.cs
|_ MyResource.resx

而在复制的项目中。cs文件依赖于。resx文件:

MyResource.resx
|_ MyResource.cs

原来在第二个项目中,.resx文件被设置为自动生成.cs文件。自动生成的.cs文件覆盖了从原始项目复制的.cs文件。

要修复此问题,请编辑复制项目中每个.resx文件的属性。自定义工具属性将被设置为类似ResXFileCodeGenerator的东西。清除.resx文件的自定义工具属性。您将需要从原始项目中重新复制.cs文件,因为它将被自动生成的文件覆盖。

对我来说是这样的。在MyStrings.Designer.cs文件中:

global::System.Resources.ResourceManager temp = 
    new global::System.Resources.ResourceManager(
      "MyApplication.MyProject", typeof(MyStrings).Assembly);

我以为MyApplication。MyProject引用类的命名空间,而不是文件的目录。我把文件放在一个名为Resources的子目录中,但名称空间没有反映这一点。

我把它改成

global::System.Resources.ResourceManager temp = 
    new global::System.Resources.ResourceManager(
      "MyApplication.MyProject.Resources", typeof(MyStrings).Assembly);

它成功了!(我甚至不需要更新名称空间!)