是否有可能根据同一项目中的代码生成和构建一些C#代码?我尝试使用T4和Reflection,但存在某些程序集锁定问题。还有其他方法吗?
是否有可能根据同一项目中的代码生成和构建一些C#代码?我尝试使用T4和Reflection,但存在某些程序集锁定问题。还有其他方法吗?
你绝对可以编写自己的代码生成器,全部使用C# - 毕竟,“生成”的“代码”只是你写出来的文本文件。
但是T4模板有什么问题吗?它们提供了许多功能,您不必再次重新发明轮子-为什么不使用它呢?您能否更详细地告诉我们您在使用T4时遇到的问题?
T4实际上只是.NET中的一堆类-因此,您绝对可以编写自己的代码生成器来处理某些逻辑,并使用T4进行模板化和替换这些模板值部分。但是:为了帮助您诊断T4问题,我们需要更多了解这些问题....
反射对我来说很有效。您可以通过在VS中将构建任务隔离到单独的AppDomain中来解决程序集锁定问题。当任务完成时,您需要用于代码生成的任何程序集都将与任务的AppDomain一起卸载。请参见AppDomainIsolatedTask
。
这个来自Oleg Sych的例子使用了FXCop的内省引擎而不是反射。这样,程序集就不会被锁定。
不幸的是,反射是为代码执行进行优化的。其中一个限制使其不适合用于代码生成 - 使用反射加载的程序集只能随其AppDomain一起卸载。因为T4模板编译成.NET程序集并缓存以提高代码生成的性能,使用反射访问组件程序集会导致T4锁定它。
或者,如果您只针对Linq to SQL类,则可以从dbml文件中生成代码,而不是从L2S从dbml生成的代码。 我在自己的博客上有一个类似的示例(edmx文件)。
我们在工作中使用了一个第三方的C# .NET版本的JavaCC。
同时,这里有一篇关于如何制作JavaCC的有趣文章: http://msdn.microsoft.com/en-us/magazine/cc136756.aspx
这真的取决于您想要实现什么,但一般情况下,我建议使用T4模板。
是的,您可以在项目内部使用T4模板来根据某些本地设置生成代码,但您应该定义您要做什么。
如果您想要根据同一项目中定义的某些类生成代码-这似乎不是很容易实现的事情(毕竟您想编译当前项目中的一些类,基于它们生成一些代码,然后再次生成类...嗯...?)
但是,如果您想存储一些设置,然后运行T4模板并根据这些设置生成一些代码-这是非常容易实现的。T4MVC就是一个例子(他们根据复制并存储在T4模板旁边的项目中的设置文件生成代码)。该模板还查看解决方案中可用的当前文件,并基于每个文件生成字符串常量。这听起来可能确实有助于您解决问题,无论它是什么:)
如果您仍然不确定-您可以指定更多关于您想要做什么的细节,我们将尝试帮助您:)