为了在 NET 下能够编译成功 我写了一个文件 Patch cs 定义了System Runtime CompilerServices ExtensionAttribute 类型 这样就可以在 下使用lambda表达式和扩展方法了 同时 添加了几个用到的System Core dll引入的Action类型
namespace System Runtime CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<T T >(T t T t )
}
然而 要在 NET 下编译 因为类型已经存在 必须注释掉Patch cs 很麻烦 于是想通过条件编译来解决 即
#if NET
namespace System Runtime CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<T T >(T t T t )
}
#endif
问题是 net 里没有定义和 net版本有关的指示符 怎么办呢?自己动手 丰衣足食 使用Build Events在编译之前自动侦测出项目所使用的 net版本 定义出我们想要的指示符
在 C#模板编程( ) 编写C#预处理器运侍 让模板来的再自然一点一文中 写了一个程序 C *** acro exe 来实现C#下的模板机制 本文在C *** acro exe 的基础上 增加侦测项目所引用的 net 版本的功能
原理 查找项目目录下的 csproj 文件 解析它 找到节点TargetFrameworkVersion 判断 net版本 然后生成一个C *** acro_Template cs文件 在里面 #define 版本指示符 例如 对 Net 项目 生成的 C *** acro_Template cs 文件内容为
#define NET
修改后C *** acro的代码可在 //github /xiaotie/GebCommon上下载(目前只处理了 net 和 如需要针对其它版本 可自行修改代码) 有了 C *** acro 一切就好办了
第一步袜族 把 C *** acro exe 放在Path路径下
第二步 打开需要条件编译的项目 添加 Pre build 事件 C *** acro exe $(ProjectDir)
第三步 编辑源文件 如 Patch cs 文件修改为
#region include C *** acro_Template cs
#endregion
#if NET
namespace System Runtime CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<T T >(T t T t )
}
#endif
告悄弊 #region include 是我引入的 C *** acro 宏语法 详见 C#模板编程( ) 编写C#预处理器 让模板来的再自然一点 一文 点击编译 系统会生成一个 Patch_C *** acro cs 文件 内容如下
#define NET
#if NET
namespace System Runtime CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
namespace System
{
public delegate void Action()
public delegate void Action<T T >(T t T t )
}
#endif
第四步 把生成的 Patch_C *** acro cs 添加到项目中来
lishixinzhi/Article/program/net/201311/16137在 VC#.net 开发环境中建立项目时,会产生 .csproj 文件族亮,这是C#的工程文模早件,其中记录了与工程有关的相旦穗雀关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)