StringsResourceGenerator,自定义任务+加载项,用于从代码管理ResourceDictionary中的字符串






4.05/5 (8投票s)
创建用于字符串的XAML文件,并生成一个类以简化代码中的使用。
引言
此加载项允许您将字符串定义到项目中的ResourceDictionary
中,并像使用RESX文件一样在代码中使用它们。这样,在本地化过程中,您无需合并卫星DLL。
MSBuild的自定义任务
此工具的核心是StringsResourceGeneratorTask,这是一个在MSBuild的BeforeBuild步骤中运行的自定义任务。您可以不使用StringsResourceGenerator加载项,而是将DLL安装到GAC中并手动编辑项目文件来使用此任务。在项目文件的底部,作为Project节点的子节点,您需要添加
<UsingTask
TaskName="StringsResourceGeneratorTask"
AssemblyName="StringsResourceGeneratorTask,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=157d1456ea169140" />
<Target
Name="BeforeBuild">
<StringsResourceGeneratorTask
Namespace="YourNamespace"
AssemblyName="YourAssembly"
ClassName="YourClassName"
StringsResourceFileName="YourRelativeFileNamePath" />
</Target>
有关UsingTask
和Target
标签的信息,请参见“参考文献”部分。StringsResourceGeneratorTask
标签定义了自定义标签及其属性(特性)。Namespace
属性指定将创建的类的命名空间。AssemblyName
属性定义项目的程序集。ClassName
是将生成的类的名称。StringsResourceFileName
是XAML和CS文件的相对路径(例如,如果文件名为“Folder1”下的LocalizableStrings.xaml和LocalizableStrings.xaml.cs,则StringsResourceFileName
的值将为“Folder1/LocalizableStrings”,不需要扩展名)。
重新加载项目。将出现一个对话框
选择“正常加载项目”。
此任务只能为C#生成代码,但很容易扩展到其他语言。您必须继承TypeCodeController
类并重写StringsCodeTemplate
属性和GeneratePropertyCode
函数。用于生成C#代码的CSController
类就是一个示例。
在项目中,您必须插入一个.xaml文件和一个.cs文件。.cs文件必须与XAML文件位于同一路径,并具有相同的名称,扩展名为.xaml.cs。
获得它的最简单方法是插入一个WPF用户控件。在XAML中,将所有内容替换为空的ResourceDictionary
,其中包含对MsCorlib库的引用和命名空间的“system
”前缀。“system
”前缀非常重要,因为自定义任务将使用它。
<ResourceDictionary
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib">
</ResourceDictionary>
在C#文件中,删除所有内容。如果要添加字符串,请转到XAML文件并添加
system:String x:Key="MyString">Hello World!</system:String>
然后编译项目(参见“已知错误”)。现在,如果要显示一个MessageBox
,您可以编写
MessageBox.Show(YuourClassName.MyString);
在Documentation.zip中,有一个名为“如何使用StringsResourceGeneratorTask”的doc文件,详细解释了任务的设置。
以下是任务的方案
加载项
此加载项在“工具”主菜单中添加一个名为“StringsResourceGenerator...”的项目。您必须在项目中选择一个项目或文件夹,您希望在其中添加用于从代码管理字符串的XAML和cs文件。然后,单击加载项项目。将出现一个对话框
StringsResourceFileName表示ResourceDictionary
和代码的文件名。例如,如果您选择LocalizableStrings
,则将在项目中添加两个文件:LocalizableStrings.xaml和LocalizableStrings.xaml.cs。
Namespace是将添加类的命名空间。AssemblyName是编译过程生成的程序集的名称。ClassName表示将生成的类的名称。生成文件后,您可以手动修改(或删除)文件名或类名,您必须编辑项目文件并更改与StringsResourceGeneratorTask相关的属性。加载项使用模板将文件添加到项目。在安装过程中,模板将位于Visual Studio 2008 C#项目模板下。没有VB的模板。
支持的环境
Visual Studio 2008是完全支持的环境。如果您使用Visual Studio 2005,则只能使用自定义任务并手动设置它(参见“MSBuild的自定义任务”)。
未来发展
支持VB项目。
已知bug
使用加载项菜单项添加XAML和cs文件后,第一次编译不起作用。第二次编译后,一切正常。如果您的项目没有WindowsBase
和PresentationFramework
作为引用,则必须手动添加它们。如果您选择项目根目录,则加载项不起作用!您必须选择一个项目或文件夹。如果您修改或删除以前创建的资源文件,则项目文件不会自动更新。
参考文献
对于自定义任务
- http://community.bartdesmet.net/blogs/bart/archive/2008/02/15/the-custom-msbuild-task-ookbook.aspx
- http://blogs.msdn.com/msbuild/archive/2005/11/23/496396.aspx
- http://bartdesmet.net/blogs/bart/archive/2006/04/13/3896.aspx
对于加载项部署