【问题标题】:Change CodeGenerator for resource file in Visual Studio C#在 Visual Studio C# 中更改资源文件的 CodeGenerator
【发布时间】:2016-03-24 05:23:51
【问题描述】:

在我的 VS2015 项目中,我使用资源文件来跟踪我的文本和相应的翻译。文本保存在 resx 文件中,对于主 resx 文件,会自动创建相应的 .designer.cs 文件,该文件通过属性公开文本。

我现在的问题是我必须修改 .desginer.cs 中生成的代码以获得一些附加功能。当然,这只有在我修改 VS 用来生成代码的模板时才有意义——但我该怎么做呢?

我注意到我可以为我当前设置为“PublicResXFileCodeGenerator”的主 resx 文件指定一个“自定义工具”:

我对自动代码生成进行了一些研究,但找不到它的基本教程,只能找到一些可以追溯到 VS2008 的复杂示例。 不幸的是,我仍然不知道这个“PublicResXFileCodeGenerator”是从哪里来的,所以我可以用它作为我自己的方法的基础。我也不知道我自己的模板是否会成为一个 .rgt 文件,以及我必须将它放在哪里(我在一个示例中看到了这些 rgt 文件,但找不到它们被分配/使用的位置)。

谁能推荐我一种修改我的 .Designer.cs 的自动代码生成的方法?

谢谢!

【问题讨论】:

    标签: c# visual-studio-2015 resx


    【解决方案1】:

    在做了更多研究后,我偶然发现了this MSDN article,它解释了如何实现“自定义工具”或“单文件生成器”。其中一个原因是生成器需要注册为 COM 组件,这听起来对我来说不是很吸引人(我是否必须在每个队友的计算机上注册它才能使其也能在他们的系统上运行?)。

    作为替代方案,我决定创建一个简单的控制台应用程序,它将“SourceFile”、“DestinationFile”和“NameSpace”作为参数。这个小应用程序将能够为我生成 .designer.cs。

    将工具添加到 TFS 并从我的资源项目的“预构建事件命令行”调用它应该是小菜一碟。

    从 TFS 中检查 .designer.cs(或添加它)应该没什么大不了的(有人告诉我)。

    使用 System.Resources.ResXResourceReader 时,遍历 RESX 文件很方便。

    最后,这不是一个很好的解决方法,但我仍然更喜欢它而不是我迄今为止找到的其他解决方案:-/

    【讨论】:

      【解决方案2】:

      我这样做的方法是删除 MyResource.resx 文件的自定义工具属性,使其不再生成任何内容,然后创建一个生成 MyResource.Designer.cs 类的 T4 模板。

      所以你的解决方案结构看起来像:

      您可以根据定期生成的设计器文件来构建结构,或者按照自己的方式使用它。

      您需要以某种方式加载资源文件。这是一个使用 ResXResourceReader 的示例(不幸的是,这是在 System.Windows.Forms 程序集中)并在 T4 模板头中将 hostspecific 设置为 true,以便您可以访问相对路径上的文件:

      string fileName = this.Host.ResolvePath("MyResource.resx");
      ResXResourceReader reader = new ResXResourceReader(fileName);
      
      // This lets you access the comment. If set to false the DictionaryEntry's
      // value will simply be the resource value.
      reader.UseResXDataNodes = true;
      
      foreach (DictionaryEntry resource in reader)
      {
          ResXDataNode node = (ResXDataNode)resource.Value;
      
          string key = (string)resource.Key;
          string value = (string)node.GetValue((ITypeResolutionService)null);
          string comment = node.Comment;
      }
      

      作为替代方案,您可以选择仍然生成常规 MyResource.Designer.cs 并枚举资源集 (taken from this answer):

      ResourceSet resourceSet = MyResource.ResourceManager
          .GetResourceSet(CultureInfo.CurrentUICulture, true, true);
      foreach (DictionaryEntry entry in resourceSet)
      {
          string resourceKey = entry.Key.ToString();
          object resource = entry.Value;
      }
      

      我的代码在构建和保存模板时重新生成,这对我来说已经足够了。它使用变体of this answer 构建。请注意,批处理文件确实运行TextTransform.exe 来生成 T4,并在基于 Visual Studio 版本的部分硬编码路径中找到此 exe,但如果您愿意,可以在批处理文件中找出版本。

      不是一个完美的解决方案,但可能是运行外部自定义可执行文件以生成代码的替代方案。这至少不需要任何人的开发环境的任何额外先决条件。

      【讨论】:

        猜你喜欢
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多