是否可以根据同一项目中的代码生成和构建一些c#代码。我试过T4和Reflection,但是有一些装配锁定问题。还有其他办法吗?
答案 0 :(得分:1)
你绝对可以用C#编写自己的代码生成器 - 毕竟,生成的“代码”只是你写出的文本文件。
但是T4模板有什么问题?它们提供了许多功能,您无需再次重新发明 - 为什么不使用它?您能否更详细地告诉我们您使用T4时遇到的问题?
T4实际上只是.NET中的一堆类 - 所以你绝对可以编写自己的代码生成器来处理一些逻辑,并使用T4来进行模板化操作。替换那些模板值部分。但同样:为了帮助您诊断T4问题,我们需要了解更多关于那些......
答案 1 :(得分:1)
反射对我来说很好。您可以通过将构建任务隔离到VS中的单独AppDomain来解决程序集锁定问题。任务完成后,您需要用于代码生成的任何程序集将与任务的AppDomain一起卸载。请参阅AppDomainIsolatedTask
。
答案 2 :(得分:1)
This example from Oleg Sych使用FXCop的内省引擎而不是反射。这样,程序集就不会被锁定。
不幸的是,Reflection已经过优化 用于代码执行。一个特别的 限制使它不适合 代码生成 - 加载的程序集 使用Reflection只能卸载 使用它的AppDomain。因为T4 模板编译成.NET 程序集和缓存以改进 代码生成的性能,使用 反映访问组件 装配使T4锁定它。
或者,如果您只将Linq定位到SQL类,则可以从dbml文件生成代码,而不是从dbml生成L2S生成的代码。 I've got an example of something similar (an edmx file) on my own blog
答案 3 :(得分:0)
我们在工作中使用了JavaCC的第三方C#.NET变体。
还有一篇关于如何制作一篇文章的有趣文章: http://msdn.microsoft.com/en-us/magazine/cc136756.aspx
答案 4 :(得分:0)
这实际上取决于你想要实现的目标,但在一般情况下,我建议使用T4模板。
是的,可以在项目中使用T4模板根据一些本地设置在项目中生成代码,但是你应该定义你想要做什么。
如果你想根据你在同一个项目中定义的某些类生成代码 - 这听起来不像是可以轻松实现的东西(毕竟你想编译当前项目中的一些类,生成一些基于代码的代码)在他们之后再次生成课程...嗯..?)
但是如果你想存储一些设置,然后运行T4模板并根据这些设置生成一些代码 - 这很容易实现。 T4MVC就是一个例子(它们根据设置文件生成代码,该文件与T4模板一起复制并存储在项目中)。此模板还会查看解决方案中可用的当前文件,并根据每个文件生成字符串常量。这种听起来就像它真的可以帮助你解决问题,无论它是什么:)
如果您仍然不确定 - 您可以指定有关您想要做的更多详情,我们会尽力帮助您:)