资源文件(resx)不尊重自定义工具命名空间

时间:2016-12-08 12:38:15

标签: c# .net visual-studio namespaces manifest

在resx属性中,我将自定义工具命名空间从DefaultNamespace更改为MyNamespace.Language,并生成以下代码:

namespace MyNamespace.Language
{
  public class CommentResources
  {
    public static global::System.Resources.ResourceManager ResourceManager {
      get {
           //removed code...
           global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DefaultNamespace.CommentResources", typeof(CommentResources).Assembly);
  }
}

正如您所看到的,只更改了类命名空间,但没有更改ResourceManager构造函数中传递的命名空间,因此,当我实例化ResourceManager(typeof(CommentResources))并尝试访问某个键时,它会抛出 MissingManifestResourceException ,例如:

var manager = new ResourceManager(typeof(CommentResources));
var resource = manager.GetString("myKey");

我怎样才能真正改变命名空间?

修改

请看下面的解决方案。每当我在Enviroment文件夹中创建一个resx文件时,它就会创建一个不需要的命名空间。这就是我试图避免的事情

enter image description here

1 个答案:

答案 0 :(得分:0)

我最近偶然发现了同样的问题。

似乎Visual Studio 2017生成的代码从 RootNamespace.SubFolder.ResourcesFileName 而不是 CustomToolNamespace.ResourcesFileName 创建ResourceManager

由于代码是从Visual Studio的Single-File Generator工具创建的,该工具名为ResXFileCodeGenerator(用于内部类)或PublicResXFileCodeGenerator(用于公共类),内部使用StronglyTypedResourceBuilder类,因此无法自定义行为,而不是将您自己的Single-File Generator实现为Visual Studio扩展并将其用作EmbeddedResource的生成器。

幸运的是,有一个更简单的解决方法。在.csproj文件的EmbeddedResource标记下,指定LogicalName标记,文本值为 RootNamespace.SubFolder.ResourcesFileName.resources

在您的具体情况下,它看起来像这样:

<LogicalName>DefaultNamespace.CommentResources.resources</LogicalName>