使用.resx
文件中的.cs
元素在DependentUpon
文件下嵌套.csproj
文件,然后使用包装器MissingManifestResourceException
访问资源时被扔了。
消息显示:
无法找到适合指定文化或中性文化的任何资源。确保在编译时将“Namespace.Resource.resources”正确嵌入或链接到程序集“Assembly”中,或者所有所需的附属程序集都是可加载和完全签名的。
示例代码:
MessageBox.Show(Resource.Key);
为什么会出现此错误?
答案 0 :(得分:2)
MSBuild目标PrepareResourceNames
(PrepareResources
也会调用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为其提供了一个钩子。