访问嵌套在.cs文件下的.resx文件的资源包装器时出现MissingManifestResourceException

时间:2014-12-01 16:15:18

标签: c# .net msbuild csproj

使用.resx文件中的.cs元素在DependentUpon文件下嵌套.csproj文件,然后使用包装器MissingManifestResourceException访问资源时被扔了。

消息显示:

  

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

示例代码:

MessageBox.Show(Resource.Key);

为什么会出现此错误?

1 个答案:

答案 0 :(得分:2)

MSBuild目标PrepareResourceNamesPrepareResources也会调用ResGen依赖)调用名为CreateManifestResourceName的任务。
[见Microsoft.Common.targets]

此任务创建.resources文件的名称。对于C#,在CreateManifestNameImpl中创建名称的实际方法是Microsoft.Build.Tasks.CreateCSharpManifestResourceName。此方法检查.resx文件是否具有.cs文件作为父文件。在这种情况下,它会在.cs文件中搜索它可以找到的第一个完全限定的类名,并将其作为.resources文件名。 [见Microsoft.Build.Tasks.v4.0.dll]

.resx包装器不希望更改此文件名,因此会抛出异常。

我猜这种行为是为WinForms本地化实现的,它在相应的表单或控件下嵌套其资源。

我决定不嵌套.resx个文件。一种可能的解决方案是实现CreateCustomManifestResourceName任务,MSBuild为其提供了一个钩子。