国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页网络编程.Net编程 → .net 2.0 和 4.0不同的.net版本的条件编译

.net 2.0 和 4.0不同的.net版本的条件编译

我要评论 2012/11/28 13:15:36 来源:国语自产精品视频在线看 编辑:zbbingyang.com [ ] 评论:0 点击:348次

今天碰🚚到这样一个需求👦,写的【xiě de】C#库【kù】,有时候需要在【xū yào zài】.net 2.0下编译【xià biān yì】😭,有时候需要在【xū yào zài】.net 4.0下编译【xià biān yì】😭,这个库【kù】里使用💁了【le】lambda表达式,使用了【le】扩展方法✖,使用了【le】几个【jǐ gè】💌 System.Core.dll 引入的🗞Action类型【lèi xíng】。为了【le】在 .net 2.0 下能够【xià néng gòu】🎗编译成功【gōng】,我写了【wǒ xiě le】一个文件 Patch.cs,定义了【le】📡 System.Runtime.CompilerServices.ExtensionAttribute  类型【lèi xíng】,这样就🍺可以在2.0下使用lambda表达式和扩展🤪方法✖了【le】,同时⌚,添加了【le】几个用【jǐ gè yòng】🔵到的System.Core.dll 引入的🗞Action类型【lèi xíng】:

1: namespace System.Runtime.CompilerServices
2: {
3: public class ExtensionAttribute : Attribute { }
4: } 5: 6: namespace System
7: {
8: public delegate void Action();
9: public delegate void Action<T0,T1>(T0 t0,T1 t1);
10: }
11:

然而【rán ér】👯,要在【yào zài】.net 4.0 下编译,因为类【yīn wéi lèi】型已经【xíng yǐ jīng】⛎存在,必须注释掉Patch.cs,很麻烦【hěn má fán】。于是想🍱通过条件编译❎来解决🚛,即:

1: #if NET2
2:
3: namespace System.Runtime.CompilerServices
4: {
5: public class ExtensionAttribute : Attribute { }
6: }
7:
8: namespace System
9: {
10: public delegate void Action();
11: public delegate void Action<T0,T1>(T0 t0,T1 t1);
12: }
13:
14: #endif

问题是【wèn tí shì】🥩,.net 里没有定义和【dìng yì hé】🐱.net版本🍮有关的指示符【shì fú】♎。怎么办【zěn me bàn】呢🅿?自己动手,丰衣足💮食,使用Build Events在编译🚖之前自动侦测出项目【chū xiàng mù】所使用【suǒ shǐ yòng】🔰的.net版本🍮,定义出【dìng yì chū】我们想要的指【yào de zhǐ】示符【shì fú】♎。

在  C#模板编【mó bǎn biān】程(2): 编写🛸C#预处理🏛器【qì】,让模板来的【de】再自然一点 一文中,写了一【xiě le yī】个程序🚳 Csmacro.exe 来实现🥟C#下的模【xià de mó】板机制,本文在Csmacro.exe 的【de】基础🔰上👈,增加侦【zēng jiā zhēn】测项目【cè xiàng mù】🗨所引用的【de】.net 版本的【de】🏤功能【gōng néng】。

原理:查找项【chá zhǎo xiàng】目目录【mù mù lù】下的 csproj 文件【wén jiàn】🌫,解析它,找到节【zhǎo dào jiē】点TargetFrameworkVersion,判断.net版本,然后生🏯成一个🚽Csmacro_Template.cs文件【wén jiàn】🌫,在里面🥢 #define 版本指【bǎn běn zhǐ】示符。例如😵,对 .Net 2.0 项目【xiàng mù】,生成的【shēng chéng de】 Csmacro_Template.cs 文件【wén jiàn】内🕥容为⭕:

#define NET2

修改后Csmacro的代码【de dài mǎ】可在:https://github.com/xiaotie/GebCommon 上下载(目前只🏩处理了【chù lǐ le】🌙 .net 2.0 和 4.0,如需要【rú xū yào】😿针对其它版本,可自行【kě zì háng】修改代【xiū gǎi dài】码)。有了 Csmacro,一切就📋好办了🀄。

第一步【dì yī bù】,把 Csmacro.exe 放在【fàng zài】😊Path路径下🎭

第二步【dì èr bù】,打开需【dǎ kāi xū】要条件🙊编译的项目【xiàng mù】📀,添加 Pre-build 事件🍾:Csmacro.exe $(ProjectDir)

第三步【dì sān bù】,编辑源【biān jí yuán】🚧文件,如,Patch.cs 文件修改为🧖:

1: #region include "Csmacro_Template.cs"
2: #endregion
3:
4: #if NET2
5:
6: namespace System.Runtime.CompilerServices
7: {
8: public class ExtensionAttribute : Attribute { }
9: }
10:
11: namespace System
12: {
13: public delegate void Action();
14: public delegate void Action<T0,T1>(T0 t0,T1 t1);
15: }
16:
17: #endif

#region include 是我引🥊入的 Csmacro 宏语法。详见 C#模板编🕟程⛩(2): 编写【biān xiě】C#预处理【yù chù lǐ】器🐨,让模板【ràng mó bǎn】🔒来的再【lái de zài】自然一点 一文🔮。点击编译【yì】,系统会生成一🍮个【gè】 Patch_Csmacro.cs 文件,内容如【nèi róng rú】下:

1: #define NET2
2:
3: #if NET2
4:
5: namespace System.Runtime.CompilerServices
6: {
7: public class ExtensionAttribute : Attribute { }
8: }
9:
10: namespace System
11: {
12: public delegate void Action();
13: public delegate void Action<T0,T1>(T0 t0,T1 t1);
14: }
15:
16: #endif

第四步【dì sì bù】,把生成的🎑 Patch_Csmacro.cs 添加到项目中💅来【lái】。

搞定以后【hòu】,选择不同的target,编译【biān yì】时💦产生的🗄就是对该🆑target的条件【de tiáo jiàn】编译【biān yì】!

关键词:.net

阅读本文后您有什么感想? 已有 人给出评价!

  • 0 欢迎喜欢
  • 0 白痴
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙视