我认为,EF 团队Custom Tool
为此目的使用了自己的自定义。但是 Visual StudioPublicResXFileCodeGenerator
用作.resx
文件的默认自定义工具,并且该工具没有这样的功能,PublicResXFileCodeGenerator
并且它的基类ResXFileCodeGenerator
(都可以在Microsoft.VisualStudio.Design
程序集中找到)只是 Visual Studio 的包装器StronglyTypedResourceBuilder
。
它们是工具IVsSingleFileGenerator
(位于Microsoft.VisualStudio.Shell.Interop
装配体中)。所以这是您可以开始实施自己的Custom Tool
. 开始新Class Library
的,添加Microsoft.VisualStudio.Shell.14.0
和Microsoft.VisualStudio.Shell.Interop
引用。创建新类并实现此接口。界面IVsSingleFileGenerator
非常简单。它只包含两种方法:
还有关于实施的小指南。但是本指南并没有说明太多。最有用的是如何注册自己的生成器。
您最好深入研究ResXFileCodeGenerator
代码(或简单地反编译)以获取实现示例或获取一些提示,例如如何与 Visual Studio 互操作。但我认为没有理由与 VS 互操作,因为您已经提供了您需要的一切。.resx
文件内容可以被ResXResourceReader.FromFileContents
.
剩下的很简单,因为您有资源名称和值,并且只需要返回生成文件的字节数组。我认为,将资源值解析为具有无效格式的编译时错误(例如:){{param}}}
将是最大的困难。
当为即将到来的方法解析的值和参数找到时,您可以生成代码(再次作为示例,您可以参考ResXFileCodeGenerator
and StronglyTypedResourceBuilder
,或者通过 CodeDom 以您想要的方式自行完成或手动编写源代码文本)。这也应该不难,因为您已经有一个您需要在发布的问题中生成的方法的示例。
编译您自己的生成器,注册它,将其设置在文件的Custom Tool
属性中.resx
,您将获得带有方法而不是属性的资源类。
你也可以在 github 上与其他人分享。:)
这是自定义工具注册的说明(因为 msdn 链接可能迟早会死掉):
若要使自定义工具在 Visual Studio 中可用,您必须注册它,以便 Visual Studio 可以实例化它并将其与特定项目类型相关联。
在 Visual Studio 本地注册表或系统注册表中的HKEY_CLASSES_ROOT
.
例如,以下MSDataSetGenerator
是 Visual Studio 附带的托管自定义工具的注册信息:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\CLSID\{E76D53CC-3D4F-40A2-BD4D-4F3419755476}]
@="COM+ class: Microsoft.VSDesigner.CodeGenerator.TypedDataSourceGenerator.DataSourceGeneratorWrapper"
"InprocServer32"="C:\\WINDOWS\\system32\\mscoree.dll"
"ThreadingModel"="Both"
"Class"="Microsoft.VSDesigner.CodeGenerator.TypedDataSourceGenerator.DataSourceGeneratorWrapper"
"Assembly"="Microsoft.VSDesigner, Version=14.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a"
在特定语言的项目系统或服务定义的 GUID下Generators\GUID
,在所需的 Visual Studio 配置单元中创建一个注册表项。GUID
密钥的名称成为您的自定义工具的编程名称。自定义工具键具有以下值:
(Default)
- 可选的。提供自定义工具的用户友好描述。此参数是可选的,但建议使用。
CLSID
- 必需的。指定实现 IVsSingleFileGenerator 的 COM 组件的类库的标识符。
GeneratesDesignTimeSource
- 必需的。指示此自定义工具生成的文件中的类型是否可供视觉设计人员使用。对于视觉设计师不可用的类型,此参数的值需要为(零)0,对于视觉设计师可用的类型,此参数的值需要为(一)1。
请注意,您必须为您希望自定义工具可用的每种语言单独注册自定义工具。
例如,MSDataSetGenerator
为每种语言注册一次:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\Generators\{164b10b9-b200-11d0-8c61-00a0c91e29d5}\MSDataSetGenerator]
@="Microsoft VB Code Generator for XSD"
"CLSID"="{E76D53CC-3D4F-40a2-BD4D-4F3419755476}"
"GeneratesDesignTimeSource"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\Generators\{fae04ec1-301f-11d3-bf4b-00c04f79efbc}\MSDataSetGenerator]
@="Microsoft C# Code Generator for XSD"
"CLSID"="{E76D53CC-3D4F-40a2-BD4D-4F3419755476}"
"GeneratesDesignTimeSource"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\Generators\{e6fdf8b0-f3d1-11d4-8576-0002a516ece8}\MSDataSetGenerator]
@="Microsoft J# Code Generator for XSD"
"CLSID"="{E76D53CC-3D4F-40a2-BD4D-4F3419755476}"
"GeneratesDesignTimeSource"=dword:00000001