T4 文本模板 - 是否可以从主机获取编译符号?

2023-11-27

背景:

我有一个用 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(使用前将#替换为@)

T4 文本模板 - 是否可以从主机获取编译符号? 的相关文章

  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 在 .Net 托管的 IronPython 脚本中设置和获取变量

    我正在尝试使用 Net 控制台应用程序中托管的 IronPython 来构建验证规则引擎的原型 我已经将脚本精简到我认为的基础内容 var engine Python CreateEngine engine Execute from Sys
  • C# - 方法必须有返回类型

    我在调用 C 中的方法时遇到问题 不断收到消息 方法 计算 必须有返回类型 using System Diagnostics namespace WindowsFormsApplication1 public partial class F
  • “你好世界!!”在 .NET 4 中生成 3500 个页面错误

    我正在运行 Windows Vista 和 Visual Studio 2010 使用 NET 4 2 GB RAM 和大约 800 MB 可用空间 我创建了一个 Windows 窗体应用程序 但没有向其中添加任何代码 只需在发布模式下编译
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何在C#背后的代码中动态创建数据模板并绑定TreeView分层数据

    我有一个场景 其中树视图动态更改其数据模板和数据绑定定义 我在 XAML 中创建了一个树视图 如下所示
  • 时间跨度格式[重复]

    这个问题在这里已经有答案了 当您将时间跨度声明为以下形式时 如何优雅地格式化时间跨度以表示 1 小时 10 分钟 TimeSpan t new TimeSpan 0 70 0 我当然知道你可以为此做一些简单的数学计算 但我有点希望 NET
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 比较已编译的 .NET 程序集?

    有没有什么好的程序可以与编译 NET 程序集进行比较 例如 我有 HelloWorld dll 1 0 0 0 和 HelloWorld dll 2 0 0 0 我想比较差异 我该怎么做 我知道我可以使用 NET Reflector 并使用
  • C# 和匿名对象数组

    这样的表达是什么意思呢 obj DataSource new new Text Silverlight Count 10 Link Tags Silverlight new Text IIS 7 Count 11 Link http iis
  • 在 JsonConverter 中递归调用 JsonSerializer

    我正在写一个JsonConverter要执行一些我需要在读 写时完成的转换任务 特别是 我采用现有的序列化行为 并在写入 读取时添加一些附加属性 在 的里面JsonConverter 我想利用通过的JsonSerializer实例来执行大部
  • WPF:Prism 对于小型应用程序来说是不是太过分了?

    如果我不将我的应用程序分成不同的模块 否则我会认为 Prism 确实是可行的方法 我应该使用 Prism 吗 我知道 Prism 提供了一个方便的实现ICommand 我可以自己在一页代码中完成 并为我们提供IEventAggregator
  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Windows 7 任务栏:捕获缩略图

    是否可以从 Win7 任务栏捕获 实时 缩略图 我想在我的应用程序中显示 另一个窗口的 预览 但如何使用 NET 提取这些预览 Yes MSDN 杂志解释了如何 http msdn microsoft com en us magazine
  • 是否可以在 IIS7 Express 中使用自定义主机标头/绑定?

    我正在尝试配置一个新的ASP NET MVC3 using IIS7快递 在我的本地开发机器上 使用自定义域名 eg 我的本地开发机器 打开我的网络浏览器 goto http dev www mydomain com http dev ww
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 作为属性与字段访问和更改结构

    好吧 我将开始我的问题 说我了解可变结构背后的邪恶 但我正在使用 SFML net 并使用大量 Vector2f 和此类结构 我不明白的是为什么我可以拥有并更改类中的字段的值 但不能对同一个类中的属性执行相同的操作 看一下这段代码 usin
  • 用于管理 github 中共享存储库上的拉取请求的工作流程

    我正在尝试管理我不拥有但具有管理员权限的存储库上的拉取请求 当我尝试从另一个分支中提取更改时 它失败并出现不太清楚的错误 这是我的工作流程 分叉主仓库 在该分支中进行更改 致力于该分叉3 5 转到步骤2 向主存储库提交拉取请求 作为主存储库
  • Drools 中的 Mvel 方言是什么?

    我是流口水的新手 我正在创建规则 但出现编译时错误 字段不可见 我尝试检查 Jboss 示例 它们在哪里使用方言 mvel 它编译了 我听不懂方言 那么什么是dialect mvel mvel 或者MVFLEX 表达式语言 has a 丰富
  • 堆叠条形图 d3.js 的每个条形上的文本

    我想在 d3 js 库提供的堆积条形图中的堆积条形的每个条形中都有一些文本 感谢您的帮助 我在这里定制了示例link但我没有改变 javascript 代码中的任何其他内容 and here is the result 这是重要的代码 st
  • 具有 3 个条件的 IF 函数

    我正在寻找一个具有 3 个条件的公式 目前它仅适用于 2 个条件 这就是我正在寻找的 E9有一个号码 如果号码是21 然后我希望它显示文本1 如果数字介于5 and 21 然后我希望它显示文本2 如果数字低于5 然后我希望它显示文本3 这就
  • 如何取消Spring定时器的执行

    我需要取消 Spring 计时器执行或至少根据某些条件更改执行频率 两者都在使用org springframework scheduling quartz SimpleTriggerBean and org springframework
  • 从 oracle 函数返回布尔值

    尝试从函数返回值 create or replace function compairenumber num1 in number num2 in number return boolean is begin if num1 lt num2
  • 在可以出现零次或多次的字符之后截断 R 中字符串的末尾

    我有以下数据 temp lt c AIR BAGS FRONTAL SERVICE BRAKES HYDRAULIC ANTILOCK PARKING BRAKE CONVENTIONAL SEATS FRONT ASSEMBLY POWE
  • 如何“限制”

    内的文本?

    我这里有一个邮件模板通讯 http www newsletter vendopor com m29 04 13 index2 html 但最后有一个包含该文本的段落 感谢您的支持 我很羡慕您的朋友们 这段文字 走出段落 我在css中有一个宽
  • 更改 jQuery 数据表中显示的行数

    为什么行数jquery datatable 见下面的代码 是不是设置为5 默认情况下等于 10 8as 为什么 iDisplayLength 5在这里不起作用
  • Angular - HTTP 拦截器重试具有特定错误状态的请求?

    我正在尝试使用拦截器来处理 http 错误并重试特殊错误状态 在我的例子中是状态代码 502 intercept request HttpRequest
  • 如何以编程方式更改操作栏项目的背景颜色

    通过设置可以轻松设置操作栏中项目背景的默认颜色
  • 如何从特定列中检索特定数据?

    我的应用程序有一个包含列的 SQLite 表id category and item name category是字符串类型 主键是id 我想检索类别中所有项目的名称Veg然后在列表视图中显示它 我尝试了以下查询 String vg Veg
  • 在 Angular 组件的模板中使用“this”关键字

    假设我们有一个prop组件类中的变量 我们通过模板中的插值使用它 堆栈闪电战演示 组件类 Component export class AppComponent prop Test 模板 p this prop p p prop p 为什么
  • 禁用一点工具提示?

    我的图表是这样的 http jsfiddle net gh get jquery 1 9 1 highslide software highcharts com tree master samples highcharts demo 3d
  • 通过 XHR Request 下载 PDF 文件

    通过 XHR 请求下载 pdf 文件是完全不可能的吗 我知道已经有很多关于这个主题的其他讨论 但遗憾的是 我仍然对它们不满意 我正在使用 AngularJs 并使用其发出请求 Http方法 它不会返回任何文件下载弹出窗口 但是 如果我在新的
  • 在 PowerShell 中关闭所有资源管理器窗口

    我正在编写以下代码来使用 PowerShell 关闭所有资源管理器窗口 New Object comObject Shell Application Windows FullName ne null FullName toLower End
  • Flutter:从 GestureDetector 获取本地位置

    我正在使用 GestureDetector 来获取此事件 onHorizontalDragStart onDragStart onHorizontalDragUpdate onDragUpdate 但如何才能将全球位置转变为本地位置呢 被移
  • 使用 twitter4j 库拥有多个 Twitter 实例。

    我需要能够做出不同的事情Twitter实例与相同的消费者密钥和秘密 但不同的用户级别访问令牌 我已经使用标准 Twitter OAuth 登录协议根据我的应用程序的消费者凭据获取了 10 个用户的访问令牌 现在 我想创建一个 Twitter
  • T4 文本模板 - 是否可以从主机获取编译符号?

    背景 我有一个用 C 编写的开源游戏库 它使用不安全代码 指针算术等对性能进行了高度调整 我最近将该库移植到了 Windows Phone 不幸的是 Windows Phone 根本不支持不安全代码 因此我不得不在源代码中添加如下预处理器指