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

3
在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");

我该如何真正更改命名空间?
编辑:
请查看下面我的解决方案。每当我在“环境”文件夹中创建一个resx文件时,它都会创建一个不需要的命名空间。这就是我想要避免的。

enter image description here


这个程序很好地符合你医生的常规建议:“如果疼痛就不要做”。如果你想采用另一种方法,你需要解释为什么更改命名空间对你很重要,以及为什么更改项目的默认命名空间设置还不够。 - Hans Passant
这还不够好。在我的一个项目(csproj)中,我必须为每个类创建一个resx,并且有几个类位于文件夹内,但这些类没有“文件夹”命名空间,resx也不应该有,所以就是这样。例如,有一个名为Enviroment的文件夹,我不能把它作为命名空间的一部分,因为你知道,“Enviroment”已经是一个类。那只是一个例子,还有其他几个类似的文件夹。 - JobaDiniz
我们提供非常好的退款保证。请不要告诉我,将其添加到您的问题中。详细解释一下,尤其是"文件夹"的细节。 - Hans Passant
1个回答

2

我最近遇到了相同的问题。

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

由于代码是从Visual Studio的Single-File Generator工具生成的,该工具称为ResXFileCodeGenerator(用于内部类)或PublicResXFileCodeGenerator(用于公共类),它在内部使用StronglyTypedResourceBuilder类,没有办法自定义其行为,除了实现自己的Single-File Generator作为Visual Studio扩展并将其用作嵌入式资源的生成器。

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

在您的特定情况下,它看起来像这样:

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

事实证明我错了... ResourceManager("DefaultNamespace.CommentResources", typeof(CommentResources).Assembly) 是正确的,这不是一个 bug。第一个参数(DefaultNamespace.CommentResources)是嵌入在程序集中的 resx 文件的路径 - JobaDiniz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接