为了在NET 下能够编译成功我写了一个文件 Patchcs定义了SystemRuntimeCompilerServicesExtensionAttribute类型这样就可以在下使用lambda表达式和扩展方法了同时添加了几个用到的SystemCoredll引入的Action类型
namespace SystemRuntimeCompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<TT>(T tT t)
}
然而要在NET 下编译因为类型已经存在必须注释掉Patchcs很麻烦于是想通过条件编译来解决即
#if NET
namespace SystemRuntimeCompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<TT>(T tT t)
}
#endif
问题是net 里没有定义和net版本有关的指示符怎么办呢?自己动手丰衣足食使用Build Events在编译之前自动侦测出项目所使用的net版本定义出我们想要的指示符
在 C#模板编程() 编写C#预处理器让模板来的再自然一点一文中写了一个程序 Csmacroexe 来实现C#下的模板机制本文在Csmacroexe 的基础上增加侦测项目所引用的net 版本的功能
原理查找项目目录下的 csproj 文件解析它找到节点TargetFrameworkVersion判断net版本然后生成一个Csmacro_Templatecs文件在里面 #define 版本指示符例如对 Net 项目生成的 Csmacro_Templatecs 文件内容为
#define NET
修改后Csmacro的代码可在https://githubcom/xiaotie/GebCommon上下载(目前只处理了 net 和 如需要针对其它版本可自行修改代码)有了 Csmacro一切就好办了
第一步把 Csmacroexe 放在Path路径下
第二步打开需要条件编译的项目添加 Prebuild 事件Csmacroexe $(ProjectDir)
第三步编辑源文件如Patchcs 文件修改为
#region include Csmacro_Templatecs
#endregion
#if NET
namespace SystemRuntimeCompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<TT>(T tT t)
}
#endif
#region include 是我引入的 Csmacro 宏语法详见 C#模板编程() 编写C#预处理器让模板来的再自然一点 一文点击编译系统会生成一个 Patch_Csmacrocs 文件内容如下
#define NET
#if NET
namespace SystemRuntimeCompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<TT>(T tT t)
}
#endif
第四步把生成的 Patch_Csmacrocs 添加到项目中来
搞定以后选择不同的target编译时产生的就是对该target的条件编译!