Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio C中更改资源文件的代码生成器#_C#_Visual Studio 2015_Resx - Fatal编程技术网

C# 在Visual Studio C中更改资源文件的代码生成器#

C# 在Visual Studio C中更改资源文件的代码生成器#,c#,visual-studio-2015,resx,C#,Visual Studio 2015,Resx,在我的VS2015项目中,我使用资源文件来跟踪我的文本和相应的翻译。文本保存在resx文件中,对于主resx文件,将自动创建相应的.designer.cs文件,该文件通过属性公开文本 我现在的问题是,我必须修改.desginer.cs中生成的代码以获得一些附加功能。当然,这只有在我修改VS用来生成代码的模板时才有意义——但我如何才能做到呢 我注意到我可以为我的主resx文件指定一个“自定义工具”,该文件当前设置为“PublicResXFileCodeGenerator”: 我对自动代码生成做了

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

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

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

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

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


谢谢

在做了一点进一步的研究之后,我终于找到了解释如何实现“自定义工具”或“单文件生成器”的方法。其中一个原因是,生成器需要注册为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;
}