代码改变世界

随笔分类 -  MSIL/MSBuild/Emit

IOC/AOP随笔目录

2012-02-12 23:28 by 破狼, 8196 阅读, 收藏, 编辑
摘要: 在当前软件开发OO设计中,面对软件需求的各种潜在变化,我们可能会采用领域驱动开发,把我们的各个业务逻辑分层次隔离解除耦合,这就出现了N层架构(这面值得是逻辑上的分层,当然我们的逻辑分层层次需要比物理架构层次多),这样将会使得我们的软件能够适应更多的需求变化。关于领域驱动开发的实例网上都很多,不得不推荐的是微软开源实例项目的NLayerApp:http://microsoftnlayerapp.codeplex.com/。 然而在于我们的逻辑分层的每一层次之间的耦合度解耦也是一个常见的问题.这样在层次的变化中我们需要实现不变更服务层次,这是我们的设计必须依赖于不变接口(抽象)。对于分层的接口对. 阅读全文

PostSharp - Thread Dispatching(GUI多线程)

2011-08-18 11:06 by 破狼, 3208 阅读, 收藏, 编辑
摘要: 在我们的桌面应用程序(不管是WinForm还是WPF)我们都必须去面对线程的dispatching。在window图形用户系统中像基于.net的WinForm或者是WPF都有一个唯一的主线程。他们是基于Win32消息循环队列机制处理UI界面的事件(又分为事件的钻取和隧道)、渲染。所以在一个长时间的事件处理中,我们的UI不会得到及时的更新和响应,甚至会出现假死状态。所以在GUI编程有这么一条黄金规则:不要再GUI主线程处理长时间的应用。对于长时间的处理,我们需要应用在异步线程中,并且通常认为最佳的实践并不是为每一个操作创建一个线程,而是放入线程池队列中。注:一下代码都分析了WinForm,但是贴 阅读全文

MSBuild + MSILInect实现编译时AOP-改变前后对比

2011-08-09 23:20 by 破狼, 2844 阅读, 收藏, 编辑
摘要: 实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1)。 我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方法,重新组装成一个方法(并加上[CompilerGenerated]标签),在加入横切注入接口前后代码,调用此方法。比如代码:[TestAOPAttribute(Order=1)]publicClass1TestMethod1(inti,intj,Class1c){Console.WriteLine("ok 阅读全文

MSBuild + MSILInect实现编译时AOP之预览

2011-08-09 14:05 by 破狼, 3338 阅读, 收藏, 编辑
摘要: 在本文之前的前几篇浅谈.NET编译时注入(C#-->IL)、浅谈VS编译自定义编译任务—MSBuild Task(csproject)、编译时MSIL注入--实践Mono Cecil(1)已经讨论了MSBuild和Mono.Cicel。在这里我们将会利用它来实现一个简单的编译时AOP注入机制(这里所说的编译时是指c#到MSIL的预编译过程)。我更倾向于像EL(微软企业库框架)这类动态AOP。编译时AOP有PostSharp这种被称之为静态AOP框架,其优势在于直接代码语句,性能更好,它不需要我们多余的代码,像EL这种动态AOP,一般我们是不能直接new一个对象,需要容器(Containe 阅读全文

编译时MSIL注入--实践Mono Cecil(1)

2011-07-28 21:34 by 破狼, 13138 阅读, 收藏, 编辑
摘要: 紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注入,紧接第二篇中我们介绍了自定义MSBuild编译任务(记得有位老兄发链接用 MSBuild自动发布Silverlight xap ,我想说的我做的是自定义编译任务,不是什么发布,MSBuild本就是一个发布工具)。之所以在此前介绍编译Task是因为我讲介绍的就是利用MSBuild和MSILInject制作静态注入式AOP,想成熟的产品PostSharp,当然我也不会去重造轮子,但需要明白起原理和 阅读全文

浅谈VS编译自定义编译任务—MSBuild Task(csproject)

2011-07-27 23:17 by 破狼, 15102 阅读, 收藏, 编辑
摘要: 在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入。紧接着在这节,要来看的就是MSBuild Task。在我们的代码预编译过程中我们可以创建我们自己的任务Task。下面我们就开始做一个简单的Task。1:首先需要添加Microsoft.Build.Utilities.v3.5.dll和Microsoft.Build.Framework.dll中引用。在Microsoft.Build.Framework中为我们定义了接口ITask,自定义任务需要去实现这个契约。其定义如下:publicinterfac 阅读全文

浅谈.NET编译时注入(C#-->IL)

2011-07-26 21:27 by 破狼, 11322 阅读, 收藏, 编辑
摘要: .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点。本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入等等。1:我们先来看看最简单的var:C#:publicvoidTestVar(){ vari=0; Console.WriteLine(i);}. 阅读全文