C# 在Visual Studio C中更改资源文件的代码生成器#
在我的VS2015项目中,我使用资源文件来跟踪我的文本和相应的翻译。文本保存在resx文件中,对于主resx文件,将自动创建相应的.designer.cs文件,该文件通过属性公开文本 我现在的问题是,我必须修改.desginer.cs中生成的代码以获得一些附加功能。当然,这只有在我修改VS用来生成代码的模板时才有意义——但我如何才能做到呢 我注意到我可以为我的主resx文件指定一个“自定义工具”,该文件当前设置为“PublicResXFileCodeGenerator”: 我对自动代码生成做了一些研究,但找不到它的基本教程,只有一些可以追溯到VS2008的复杂示例。 不幸的是,我仍然不知道这个“PublicResXFileCodeGenerator”是从哪里来的,因此我可以将它用作我自己的方法的基础。我也不知道我自己的模板是否会是一个.rgt文件,以及我必须把它放在哪里(我在一个例子中看到了那些rgt文件,但无法找到它们被分配/使用的位置) 有谁能给我推荐一种修改my.Designer.cs的自动代码生成的方法吗C# 在Visual Studio C中更改资源文件的代码生成器#,c#,visual-studio-2015,resx,C#,Visual Studio 2015,Resx,在我的VS2015项目中,我使用资源文件来跟踪我的文本和相应的翻译。文本保存在resx文件中,对于主resx文件,将自动创建相应的.designer.cs文件,该文件通过属性公开文本 我现在的问题是,我必须修改.desginer.cs中生成的代码以获得一些附加功能。当然,这只有在我修改VS用来生成代码的模板时才有意义——但我如何才能做到呢 我注意到我可以为我的主resx文件指定一个“自定义工具”,该文件当前设置为“PublicResXFileCodeGenerator”: 我对自动代码生成做了
谢谢 在做了一点进一步的研究之后,我终于找到了解释如何实现“自定义工具”或“单文件生成器”的方法。其中一个原因是,生成器需要注册为COM组件,这对我来说不是很有吸引力(我是否需要在每个队友的计算机上注册此组件,使其在他们的系统上运行?) 作为替代方案,我决定创建一个简单的控制台应用程序,它以“SourceFile”、“DestinationFile”和“NameSpace”作为参数。这个小应用程序将能够为我生成.designer.cs 将该工具添加到TFS并从我的资源项目的“预构建事件命令行”调用它应该是小菜一碟 从TFS中签出.designer.cs(或添加它)应该不是什么大事(有人告诉我) 使用System.Resources.ResXResourceReader时,可以方便地遍历RESX文件
最后,这不是一个很好的解决方案,但我仍然更喜欢它,而不是我目前找到的其他解决方案:-/我这样做的方式是删除自定义工具属性,例如,
MyResource.resx
文件,这样它就不再生成任何内容,然后创建一个T4模板,生成MyResource.Designer.cs
类
因此,您的解决方案结构如下所示:
您可以根据定期生成的设计器文件创建结构,也可以自行处理
您需要以某种方式加载资源文件。下面是一个使用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
并枚举资源集():
我的代码在构建时和保存模板时重新生成,这对我来说已经足够了。它通过使用变体进行构建。请注意,批处理文件确实运行textcransform.exe
,以生成T4,并在基于visual studio版本的部分硬编码路径中找到此exe,但如果愿意,您可以在批处理文件中找出版本
这不是一个完美的解决方案,但可能是运行外部自定义可执行文件以生成代码的替代方案。对于任何人的开发环境,这至少不需要任何额外的先决条件
ResourceSet resourceSet = MyResource.ResourceManager
.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value;
}