背景:
我有一个用 C# 编写的开源游戏库,它使用不安全代码、指针算术等对性能进行了高度调整。我最近将该库移植到了 Windows Phone。不幸的是,Windows Phone 根本不支持不安全代码,因此我不得不在源代码中添加如下预处理器指令:
#if WINDOWS || XBOX
public unsafe struct Foo
#elif WINDOWS_PHONE
public struct Foo
#endif
由于这些指令的数量,代码库变得非常不可读且难以维护,因此我一直在探索其他选项 - 其中之一是使用 T4 的文本模板。
问题:
在沿着 T4 路线走得太远之前,我需要知道的是是否可以从文本模板中获取编译符号?我研究过模板参数,但从外部修改它们似乎并不容易。理想情况下,我希望看到的是这样的:
<# if (Host.CompilationSymbols.Contains("WINDOWS_PHONE") { #>
public struct Foo
<# { #>
如果有人能阐明这是否可能,我将不胜感激!
马特,
它们不可用,不可用,因为从 VS2010 开始,项目的编译和模板的编译是完全隔离的。
不过我有一个(有点笨拙)的解决方法给你。
如果您包含包含模板指令的存根文件,则可以使用适当的编译符号设置编译器选项。
例如一个简单的存根,包含以下内容,名为 Define.t4:
<#@ template compilerOptions="/d:XBOX" debug="false" hostspecific="false" language="C#" #>
将其放入名为 XBOX 的子目录中,并将类似的放入名为 PHONE 的目录中
<#@ template compilerOptions="/d:PHONE" debug="false" hostspecific="false" language="C#" #>
请注意编译器符号定义。
现在将环境变量设置为 XBOX 或 PHONE - 假设为 ARCHITECTURE
现在,不要在模板中包含模板指令,而是包含 Define.t4 文件,您将能够使用常规 C#/VB 条件语法。不要忘记将 #if 放在自己的行上。这是一个例子:
<#@ include file="$(ProjectDir)%ARCHITECTURE%\Define.t4" #>
<#@ output extension=".txt" #>
<#
#if XBOX #>
public unsafe struct Foo
<#
#else #>
public struct Foo
<#
#endif #>
希望这能让你动起来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)