Missing ManifestResourceException 访问嵌套在 .cs file 下的 .resx 文件

本文关键字:file 下的 resx 文件 cs ManifestResourceException 访问 嵌套 Missing | 更新日期: 2023-09-27 18:32:51

当使用.csproj文件中的DependentUpon元素将.resx文件嵌套在.cs文件下,然后使用包装器访问资源时,会抛出MissingManifestResourceException

消息内容如下:

找不到适合指定区域性或非特定区域性的任何资源。 确保"Namespace.Resource.resources"在编译时正确嵌入或链接到程序集"程序集"中,或者所需的所有附属程序集都是可加载的并已完全签名。

示例代码:

MessageBox.Show(Resource.Key);

为什么会发生此错误?

Missing ManifestResourceException 访问嵌套在 .cs file 下的 .resx 文件

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

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

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

我想此行为是为 WinForms 本地化实现的,该本地化将其资源嵌套在相应的表单或控件下。

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