我正在动态生成代码,目前使用 String.Format 和嵌入占位符 - 但重新格式化 C# 代码以用作模板是一种痛苦,我认为使用 T4 模板会更好。
但是,代码生成将在正在运行的系统上进行,因此我需要知道我可以安全合法地将 Microsoft T4 引擎与我的产品一起重新分发。
还有人这样做吗?或者知道(法律)答案?
看起来可能很快就会有另一种选择。
昨天,Miguel de Icaza 发布了关于 MonoDevelop 中 T4 集成的文章,所以我期待现在任何时候都会有一个等效的单声道 T4 工具集。
您可以将 T4 作为DSLToolsRedist的一部分重新分发,但是,它需要已安装 Visual Studio 2005 标准版或更高版本。我不相信 T4 目前可以在没有 Visual Studio 的情况下合法地重新分发。Visual Studio 2010将直接支持您描述的方案
我有答案,不幸的是,正如 Oleg 所建议的那样。(顺便说一句,在 T4 上做得很好)。您此时不能重新分发 T4 - 它是 VS 的一部分。在 VS2010 中,可以预编译 T4 模板,然后使用您的应用程序重新分发这些预编译的模板,而无需 T4 依赖来运行它们。
为清楚起见,官方的回答是您不能将 Microsoft T4 引擎作为独立于 Visual Studio 的部分进行分发。
但是,从 Visual Studio 2010 开始,您可以使用和重新分发不依赖于 Visual Studio 的预编译模板。
您还可以在安装了 Visual Studio 的计算机上在 Visual Studio 之外使用 T4。
您还可以免费许可和重新分发 Visual Studio 隔离 Shell,并将其用作工具的主机 - 它包括 T4。
从 Visual Studio 2010 SP1 开始,您可以通过 VS 安装目录中 buildserver.txt 中的许可证将 T4 复制到您的构建机器。
我有自己的模板代码生成系统,在一个单独的 appdomain 中编译代码,从 VS2008 出来之前开始。
如果您有兴趣,请发表评论,我将发布代码的网址。
使用我的模板引擎的代码在这里,您可以使用 Web 浏览器浏览它或将Subversion客户端指向它。请注意,以此处开头的链接确实在单词之后停止,但服务器端 WMD 渲染器会将链接泄漏到以下文本中。
请注意,如果您只是复制该命名空间中的单个文件,那么它不会自行编译,它需要 LVK.Delegates 和 LVK.Scripting 中的一些东西,命名空间从上面的链接上升了几个级别。如果您不想吸收整个库,则需要一次提取它抱怨的部分,直到它编译为止。
在同一存储库中的/LVK_3_5/trunk/Binaries/Debug/LVK中还有一个二进制版本的库。如果您下载它,只需添加对它的引用并检查类LVK.Text.Templates.TextTemplate 即可。
不幸的是,目前我的图书馆没有任何示例。
基本上,要使用模板:
TextTemplate tt = new TextTemplate();
tt.Source = "... code here, check example file above ...";
tt.Compile();
String output = tt.Generate(singleObjectParameter);
在模板内部,基本上所有代码都插入到一个方法中(这意味着它在能够轻松添加方法方面不如 T4,但您可以使用匿名方法),您将可以访问数据对象作为名为 data 的参数传递给它。
所以只输出传递参数的内容:
<%= data %>
重复一遍:
<% for (Int32 index = 0; index < 10; index++) { %>
<%= data %>
<% } %>
如果您有任何问题,请将其发送至我的邮箱 lasse@vkarlsen.no。
我记得这是在 2006 年出现的(在我知道 T4 是什么之前!)并去搜索并找到了这个http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/1ab0bf3f-2810-4adf -bf75-900b98dee8e2/不幸的是,gotdotnet 链接已损坏。很难说他们是否在该线程中同意您可以合法地在 VS 之外托管 T4 并重新分配 - 或不。
这是一个真正的耻辱,但正如 Oleg 指出的那样,如果它未经测试,那么你怎么能发布它。
Lassevk,当然我很感兴趣 - 正在考虑重新散列我大约 10 年前构建的模板引擎,但我总是为更轻松的生活而奋斗!