<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Mainz's Blog</title><subtitle type="text">用开放的心态，打造专业的人生 | @我</subtitle><id>http://feed.cnblogs.com/blog/u/31859/rss</id><updated>2012-02-10T09:49:34Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/31859/rss"/><entry><id>http://www.cnblogs.com/Mainz/archive/2012/02/10/2345894.html</id><title type="text">ASP.NET MVC3中用内置的MEF实现IoC</title><summary type="text">本文讲述关于用Managed Extensibility Framework (MEF) 的方法来实现IoC和Asp.net的集成。很多人不知道，这个MEF貌似是个大框架，其实已经内置在.NET Framework 4.0里面了，只需要添加引用System.ComponentModel.Composition即可。MEF在Microsoft的人看来不是一个IoC/DI的工具，而是一个提供轻量级的、可扩展的、类似插件式的系统架构的、且无需配置的（Attribute Based）框架。虽然微软的人极力否认MEF是一个IoC/DI的工具，但事实是它的确可以实现Ioc/DI。而且相对于Spring.n</summary><published>2012-02-10T09:50:00Z</published><updated>2012-02-10T09:50:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2012/02/10/2345894.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/02/10/2345894.html"/><content type="html">&lt;p&gt;本文讲述关于用&lt;a href="http://mef.codeplex.com/"&gt;&lt;strong&gt;Managed Extensibility Framework&lt;/strong&gt; (MEF) &lt;/a&gt;的方法来实现IoC和Asp.net的集成。很多人不知道，这个&lt;a href="http://mef.codeplex.com/"&gt;MEF&lt;/a&gt;貌似是个大框架，其实已经&lt;span style="color: red;"&gt;内置在.NET Framework 4.0里&lt;/span&gt;面了，只需要添加引用&lt;strong&gt;System.ComponentModel.Composition&lt;/strong&gt;即可。MEF在Microsoft的人看来不是一个IoC/DI的工具，而是一个提供轻量级的、可扩展的、类似插件式的系统架构的、且无需配置的（Attribute Based）框架。虽然微软的人极力否认MEF是一个IoC/DI的工具，但事实是它的确可以实现Ioc/DI。而且相对于&lt;a href="http://www.springframework.net/"&gt;Spring.net&lt;/a&gt;这样的框架来说，它的优势就是首先它是.NET Framework内置的，你无需添加第三方的引用，担心第三方组件的更新等问题；其次它是免配置的，对&lt;a href="http://www.springframework.net/"&gt;Spring.net&lt;/a&gt;这样的庞然大物来说免配置很有诱惑力。对&lt;a href="http://unity.codeplex.com/"&gt;Unity&lt;/a&gt;来说，它的优势是一样的，.NET Framework内置，无需配置，无需hard code的声明。当然更无需直接引用了，这是所有IoC都做到的。MEF还可以通过metadata自动发现Parts而无需获取parts的assembly/dll。有关MEF的完整的介绍，请移步MSDN：&lt;a href="http://msdn.microsoft.com/en-us/library/dd460648.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd460648.aspx。&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里给出一个例子，用在Asp.net MVC3里面，主要场景是在Controller里通过接口获取中间层的实例，本文主要是演示MEF在Asp.net MVC3中的应用，其它丰富的应用完全可以发挥你自己的想象力。本文&lt;a href="http://files.cnblogs.com/Mainz/Mvc3_MEF_WebApplication.7z"&gt;源码&lt;span style="color: red;"&gt;下载&lt;/span&gt;&lt;/a&gt;&lt;span style="color: red;"&gt;在&lt;a href="http://files.cnblogs.com/Mainz/Mvc3_MEF_WebApplication.7z"&gt;这里&lt;/a&gt;。&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;整个项目的结构如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/mainz/fere34.png" height="659" width="381" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;在Controller中需要调用IBookService与IPhoneService: &lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/mainz/3r343.png" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Controller的代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;Service.Interface;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;Mvc3_MEF_WebApplication.Controllers&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Export]&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[PartCreationPolicy(CreationPolicy.NonShared)]&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;HomeController&amp;nbsp;:&amp;nbsp;Controller&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;readonly&lt;/span&gt;&amp;nbsp;IBookService&amp;nbsp;_bookService;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;readonly&lt;/span&gt;&amp;nbsp;IPhoneService&amp;nbsp;_phoneService;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ImportingConstructor]&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;HomeController(IBookService&amp;nbsp;bookService,&amp;nbsp;IPhoneService&amp;nbsp;phoneService)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_bookService&amp;nbsp;=&amp;nbsp;bookService;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_phoneService&amp;nbsp;=&amp;nbsp;phoneService;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;ActionResult&amp;nbsp;Index()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewBag.Message&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Welcome&amp;nbsp;to&amp;nbsp;ASP.NET&amp;nbsp;MVC!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_bookService.GetAllBooks().ToList()[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;].Name&amp;nbsp;+&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_phoneService.GetAllPhones().ToList()[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;].SerialNumber;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;View();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;ActionResult&amp;nbsp;About()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;View();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
}&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;BookService的实现：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/mainz/e34r.png" height="55" width="376" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;BookService的代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;Data.Model;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;Service.Interface;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;Service.Implement&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Export(&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;(IBookService))]&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;DefaultBookService&amp;nbsp;:&amp;nbsp;IBookService&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;Book&amp;gt;&amp;nbsp;GetAllBooks()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Book&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ID&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Book&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ID&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Name&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;b&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
}&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在Global.asax.cs里面需要设置MEF dependency resolver，自动加载所有bin目录下面的assembly/dll&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;Application_Start()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AreaRegistration.RegisterAllAreas();&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegisterGlobalFilters(GlobalFilters.Filters);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RegisterRoutes(RouteTable.Routes);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Set&amp;nbsp;MEF&amp;nbsp;dependency&amp;nbsp;resolver&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;catalog&amp;nbsp;=&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;DirectoryCatalog(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;bin&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;container&amp;nbsp;=&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;CompositionContainer(catalog);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.ComposeParts(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;mefDependencySolver&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;MefDependencySolver(container);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DependencyResolver.SetResolver(mefDependencySolver);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;MefDependencySolver的代码：&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition.Hosting;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;Mvc3_MEF_WebApplication.Extension&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;MefDependencySolver&amp;nbsp;:&amp;nbsp;IDependencyResolver&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;MefDependencySolver(CompositionContainer&amp;nbsp;compositionContainer)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_compositionContainer&amp;nbsp;=&amp;nbsp;compositionContainer;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;readonly&lt;/span&gt;&amp;nbsp;CompositionContainer&amp;nbsp;_compositionContainer;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&amp;nbsp;GetService(Type&amp;nbsp;serviceType)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;name&amp;nbsp;=&amp;nbsp;AttributedModelServices.GetContractName(serviceType);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;_compositionContainer.GetExportedValueOrDefault&amp;lt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&amp;gt;(name);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&amp;gt;&amp;nbsp;GetServices(Type&amp;nbsp;serviceType)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;_compositionContainer&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.GetExportedValues&amp;lt;&lt;span style="color: #0000FF;"&gt;object&lt;/span&gt;&amp;gt;(serviceType.FullName);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
}&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后系统运行的结果如下图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/mainz/df3w34.png" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总结一下所有的步骤：&lt;/p&gt;&#xD;
&lt;p&gt;1. 项目添加引用： System.ComponentModel.Composition&lt;/p&gt;&#xD;
&lt;p&gt;2. 为需要的Parts标注[Import] [Export] 等attribute&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;3. 创建一个CompositionContainer实例&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;4. 实现IDependencyResolver接口&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;5. 注册到DependencyResolver&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;更多资源&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文的实现很简单，抛砖引玉，更多内容可以参考以下资料：&lt;/p&gt;&#xD;
&lt;p&gt;1. &lt;a href="http://msdn.microsoft.com/en-us/library/dd460648.aspx"&gt;MSDN: MEF Overview &lt;/a&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;2. &lt;a href="http://mef.codeplex.com/wikipage?title=Guide&amp;amp;referringTitle=Documentation"&gt;MEF Programming Guide&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;3. &lt;a href="http://msdn.microsoft.com/en-us/magazine/ee291628.aspx"&gt;MSDN Magazine: Building Composable Apps in .NET 4 with the Managed Extensibility Framework&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外StackOverflow还有很多针对MEF高级议题(importMany集合导入, lazy惰性导入, composition/AllowMultiple复合,&amp;nbsp; metaData, lifetime等高级议题。)的讨论，可以参考下。&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此外，用MEF为Asp.net mvc 创建一个ControllerFactory可以参考&lt;a href="http://www.fidelitydesign.net/?p=88"&gt;这篇文章&lt;/a&gt;。 （用Unity的可以参考&lt;a href="http://www.cnblogs.com/artech"&gt;Artech&lt;/a&gt;的&lt;a href="http://www.cnblogs.com/artech/archive/2011/12/13/ASP-mvc-unity.html"&gt;这篇文章&lt;/a&gt;。）&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;用MEF实现Asp.net MVC的模块化开发有兴趣可以参考 &lt;a href="http://www.fidelitydesign.net/?p=104"&gt;这篇文章&lt;/a&gt;。&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;本文&lt;a href="http://files.cnblogs.com/Mainz/Mvc3_MEF_WebApplication.7z"&gt;源码&lt;span style="color: red;"&gt;下载&lt;/span&gt;&lt;/a&gt;&lt;span style="color: red;"&gt;在&lt;a href="http://files.cnblogs.com/Mainz/Mvc3_MEF_WebApplication.7z"&gt;这里&lt;/a&gt;。&lt;/span&gt;&lt;span style="color: red;"&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2345894.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/02/10/2345894.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/24/2300265.html</id><title type="text">最近的一次敏捷项目Scrum经验总结. 2011.12</title><summary type="text">Team刚刚完成了一个敏捷项目，做一下项目总结，以备以后借鉴和提高。 需求 - 沟通 – 人 - 过程 - 工具 项目要成功的最关键因素是什么？软件要快速高效又高质量的提交靠的是什么？有人说最关键...</summary><published>2011-12-24T05:17:00Z</published><updated>2011-12-24T05:17:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/24/2300265.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/24/2300265.html"/><content type="html">&lt;p&gt;Team刚刚完成了一个敏捷项目，做一下项目总结，以备以后借鉴和提高。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;需求 - 沟通 – 人 - 过程 - 工具&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;项目要成功的最关键因素是什么？软件要快速高效又高质量的提交靠的是什么？有人说最关键是项目经理，关键是沟通，有人说是技术设计，有人说是对需求的把握… … 从我看来，都是盲人摸象，项目要成功，软件要快速高效又高质量的提交，靠的是多重因素的整合和平衡；首先要对需求的准确理解和把握，贯穿全流程的沟通，做项目靠人，对人/士兵的管理（物质、心理），适合组织的先进的过程（开发，测试，评审，组织，考核），还有工具的运用和整合大大提升组织效率，缺少那一样都是不行的。成功的模式只有一个，而失败却有各式各样，就是这个道理。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;沟通，随时随地，全方位立体的，有效的，及时的沟通&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;沟通，沟通，随时随地，全方位立体的沟通。面对面、站立会议、咖啡间、IM、Email、文档、电话。上下级、跨部门、客户，沟通，直到双方的理解没有Gap（鸿沟），没有Misunderstanding（误解）。主动沟通，有问题随时反馈。对被动的同事，主动问他。注意沟通的效率和时间表，不要一个会议开两个小时。如果有必要，尽量让少的人参与，除非是kick-off会议。此外，沟通会影响时间表，比如你有个问题要问某人，而这个人下周开始休假了，要早做预防。否则，吃亏的是自己。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;白板，任务板，Sketch，Prototype&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Team位置必须坐在一起，最好是圆圈式的座位，旁边有玻璃白板，上面画好下一个里程碑和Release的Roadmap，玻璃白板便于马上沟通。任务板便于大家清楚当前致力的目标和Release。对于Sketch要用好，在产品或者功能还没有做出来以前，先把Sketch或者Prototype发给客户看一下是否认可，获得用好Remarks，然后再开始动手；毕竟动手了再修改代价就更大了。所以一定要用好Sketch草图。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Stand up meeting要不要&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;很多人说到Scrum就要每日晨会&lt;a href="http://www.infoq.com/news/2008/05/good-standup-meeting" target="_blank"&gt;Stand Up Meeting&lt;/a&gt;，但我们Team的实践来看，并不是必须的，其实敏捷也是根据组织和项目实际情况因人而异的（有人说敏捷对结对开发人员的能力要求很高，我觉得敏捷是一种境界，良好的架构，代码规范，成员间非常好的默契，才能敏捷的起来）。不能拘泥于形式主义，我主张实用主义。现在不是有&lt;a href="http://www.cnblogs.com/guaiguai/archive/2008/01/16/1040590.html" target="_blank"&gt;反敏捷&lt;/a&gt;、有&lt;a href="http://www.infoq.com/cn/news/2011/12/water-scrum-fall-is-the-norm" target="_blank"&gt;瀑布敏捷（Water-Scrum-Fall）&lt;/a&gt;、实用敏捷吗？关键是我们还没有领会敏捷的深刻内涵和思想体系，不会用敏捷的思想和思维方式高屋建瓴的思考我们的开发流程，而只是依葫芦画瓢学个一招半式，那就真的不是敏捷了。我听到有人说，敏捷只适用于产品型公司和小型项目，还有人说敏捷只适合于需求不稳定的项目，还有人说敏捷了就等于速度快，就等于客户报价可以低一些，还有人说敏捷说的什么迭代持续集成和重构都是理论，没有考虑到实际执行起来的风险……都没有错，关键是我们还没有领会敏捷的深刻内涵和思想体系，不会用敏捷的思想和思维方式高屋建瓴的思考我们的开发流程，而只是依葫芦画瓢学个一招半式，在这儿讨论，说白了还是理论，&lt;strong&gt;坐而论道不如起而行&lt;/strong&gt;，所以积极实践，加深对敏捷内涵的深刻理解，寻找适合自己组织的最佳敏捷实践方法才是良策。这样子思想理顺了，我们就不会拘泥于&lt;a href="http://www.infoq.com/news/2008/05/good-standup-meeting" target="_blank"&gt;Stand Up Meeting&lt;/a&gt;到底要不要的问题了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;保证代码质量&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;如何获得高代码质量？打个比方，现在要打仗了，如何打个漂亮的胜仗。我想你肯定知道答案了。那就是你的队伍必须各个是精兵，能力强，平时训练有素，而且还有实战经验，这样的一个兵强马壮的精兵队伍你拉出去，只要指挥好，士气高，就能打漂亮的胜仗。OK，现在你明白了，软件开发何不如此？你手下的程序员是不是技术能力很强，是不是平时就对技术研究很深，对某科技术有很深的理解，还有很多项目经验，是不是干劲十足，是不是对他们做了培训，是不是做了编程规范的要求，都明白了命名规范、异常处理、日志处理、安全性、用户权限、配置文件、设计模式、线程安全、单元测试、调试技巧、条件编译等项目标准处理；如果还没有这些标准的贯彻，那你的士兵还需要培训（训练），这样子上战场会很危险。当然，有个变通办法，让资深程序员带小弟，小弟在一边看着，下个项目备用。当然。除了培训以外，分享、知识库都是团队很重要的机制。&lt;/p&gt;  &lt;p&gt;基础不扎实的程序员代码质量不会高起来，比如有的C#程序员根本理解Task.Factory.StartNew这句话是异步执行的线程池起线程，就把它放到同步的循环里面，导致问题。再比如，有的程序员用匿名函数，不懂闭包，导致放在循环里面每次取到的都是最后一个值。再比如有的程序员不深刻理解Session，就认为浏览器关了Session就没有了。再比如有的C#程序员不理解GC以为一个类只要实现了IDisposable接口就一定会内存释放……举不胜举，都是项目中遇到过的（注：对基础不扎实的程序员进行代码Review管用吗？我们项目实践来看不管用，因为资深程序员很忙，不可能一行一行去看去调试。）……所以，优秀的程序员都是建立在对该技术的&lt;strong&gt;深入理解&lt;/strong&gt;的基础上的。优秀的成熟的程序员员工都有&lt;strong&gt;专业化&lt;/strong&gt;（技术方面）、&lt;strong&gt;职业化&lt;/strong&gt;（服务意识、协作能力、解决问题的能力和态度）和&lt;strong&gt;商业化&lt;/strong&gt;（替客户思考和解决问题）多方面的优秀特质，才能真正的为业务创造价值。&lt;/p&gt;  &lt;p&gt;保证代码质量的另外一个非常重要的方面就是测试，一定要写单元测试，使用Moq做单元测试。这可以培养程序员面向接口的思维方式，如果代码不能做单元测试往往是耦合度很高的代码，所以单元测试能发现代码质量的问题。此外，测试组的工作要及早介入，对业务的深刻理解，重复利用bug管理工具，敏捷测试。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;为需求变化和维护早作准备&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在系统设计的时候，要考虑到未来可能的需求变化，做好面向变化的架构设计。但不要过度设计。（这需要深入理解商业需求）&lt;/p&gt;  &lt;p&gt;为维护早作准备，意思是说，在编码阶段，就要考虑到系统的可维护性，设想你自己就是将来维护这个系统和这段代码的人，这种意识很重要。有的程序员以为系统提交了上线了就没他的事情了，结果到头来上线了出现问题，系统又没有很好的log和trace，导致问题极难线上调试，而线下又不能模拟真实的环境，这种情况下必须为维护而设计，提升系统的可维护性、可追溯性、可管理性。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关注非功能性需求&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;也许大多数客户和咨询师也会听说过神马TDD、迭代、原型、持续集成和持续部署、Agile等时髦的词语，这些也让管理者很兴奋，以为软件产品是可以在很短的时间内高质量的完成的，即使完不成也可以在后面用TDD，快速迭代，不断重构，持续集成直至持续部署的方法在进行软件开发。这听起来好像很美好。但其中有个很大的陷阱，那就是客户和咨询师，还有原型、TDD大都只关注功能性需求，而忽略了非功能性需求，比如&lt;strong&gt;性能问题，高可用性问题，系统维护问题（模块的耦合问题），&lt;/strong&gt;等等。客户和咨询师在项目前期闭口不提这些或很少提及，但一旦功能性需求都做完了他们就会抱怨这些隐藏的非功能性需求。而像性能问题，高可用性问题，系统维护问题（模块的耦合问题）等并不是很容易重构，往往涉及到Re-design, re-architect；因此这些问题往往都&lt;strong&gt;在后期会成为重构噩梦&lt;/strong&gt;，甚至可以让你的软件设计重新来过！更加糟糕的是，大多数客户不愿意为这些隐藏的功能重构而付钱。笔者曾经遇到过前期只注重功能性需求而后期发现性能不好而进行re-design, re-architect，这对项目管理来说有很大的挑战，因为不单单是程序和架构重构的困难，还要面对时间和人力成本的增加，最难的是你还要面对的是团队士气因为不断的rework而逐渐低落并产生厌倦和懈怠情绪。这是一个很大的陷阱。&lt;/p&gt;  &lt;p&gt;所以，前期就要关注非功能性需求，不要急于动手，如果你能有多一些时间去和客户讨论一下需求和未来可能的变化，去调查一下实现的技术难点和细节，去和其他有经验的人讨论并推敲一下架构和设计，去思考设计上的缺陷，那么，你的coding会变得非常地直，直到你一眼就看到尽头，你的测试案例也会写得非常地好，你会几乎不需要重构，于是，你会在未来少写很多代码，从而你的软件开发会越来越轻松，直到技术开始换代。&lt;strong&gt;这就好像我们修路造桥一样，我们需要花大量的时间勘测地形地质，分析数据，思考可能出现的各种问题（各种自然灾害），评估不同的设计方案，而不是先尽快建好再说&lt;/strong&gt;。(：磨刀不误砍柴工) 说到这里，有些&lt;strong&gt;反敏捷&lt;/strong&gt;（反Scrum），没错，&lt;font color="#ff0000"&gt;好的程序员要会做权衡/平衡，好的架构师要会做平衡，好的项目经理也要会做平衡，这非常重要&lt;/font&gt;。&lt;/p&gt;  &lt;p&gt;再补充一点，有资深经验的工程师/架构师对非功能性需求的设计和平衡很有经验，这些经验对系统设计和项目成功至关重要。如果你很不幸，手头没有这些有经验有价值的人，而只有一堆码农，那么恭喜你，你可以在一张白纸上画画了。就开发他们的潜力吧，做好这个项目给他们积累经验的心理准备吧，量力而行吧，小马过河吧……实在不行你就自己上吧，毕竟公司要求用最少的钱在最短的时间内出来最优秀的东西；如果你有话语权，那就把你的困难及早让上层知晓。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;资源提供者和问题解决者&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;大家都知道，打仗的时候什么最重要？对了，补给（后勤保障）。士兵上战场了，谁做后勤？项目经理。每天都要问大家，你下一步需要什么，你还缺什么输入？你有什么问题需要我这边配合的？程序员旁边有垃圾了，项目经理去扫一下地，这就是后勤补给。所以管理者首先要理顺管理者和人的关系，调整好服务的意识，做好资源源源不断的提供、帮助大家解决问题，系统就有了润滑剂，有了源源不断的输入，就能顺畅的开展。否则，千里马到你手里也跑不快的。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;管理用户期望&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;对每一个Sprint提交，谨慎选择功能集合，多和客户沟通，管理好用户期望，他下一阶段希望有什么功能，这些功能的优先级如何，实现难度如何，及早告诉他下一个版本会友什么，不会有什么。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;管理团队目标和情绪&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Scrum有一个优点就是短周期快速迭代，每周大家都有明确的目标，因为Release周期很短，大家Vision很明确，所以为什么Sprint就是冲刺的意思。管理好团队的目标、Vision，有明确的目标，有冲刺的干劲。及时发现团队的情绪波动，采取应对措施（休整，腐败，激励）。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;保持耐心，不断调整&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;技术上要重构，架构改进和提炼等。信任程序员，给他们时间来重构，来调整和优化架构等。管理上要重构，代码促进委员会，评审组等等。改进适合组织规模和业务发展的流程，目标是获得持续、快速、更好质量的交付产品和更好的客户满意度、更低的成本和更高的效率。总之，要不断努力，不断调整，不断尝试新的方法，做的越来越好。&lt;strong&gt;要保持耐心，给员工/系统的成长/成熟一点信任和时间&lt;/strong&gt;。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;项目经理的人格魅力和以德服人&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;作为项目经理您必须与同事以团队合作方式才能保证项目的顺利完成，如何鼓舞团队成员的士气？让大家心甘情愿的与你朝着共同的目标努力。要做到这一点，人格魅力非常重要。但要让大家真正服你，真正的服是&lt;strong&gt;以德服人&lt;/strong&gt;。比如，你要求所有的手下都主动配合你的工作，但是你自己如果没有首先&lt;strong&gt;要求自己&lt;/strong&gt;主动配合大家，你就不会赢得大家的尊重。这只是一个例子而已，很多点滴细微之处会让大家感觉到你的人格魅力，究竟是一个值得尊敬的人，还是一个不值得尊敬的、自我的、高高在上的发布命令者。总之，做人是最要紧的，做人没做好，做事肯定做不好了，项目多半要搞砸。&lt;/p&gt;  &lt;p&gt;但就项目经理的&lt;strong&gt;项目管理能力&lt;/strong&gt;来说，也关系到项目的成败，比如能否引导客户需求、对问题的透彻理解、对复杂的任务紧密跟踪并设定轻重缓急、利用各种渠道和方法来沟通解决问题、有能力做出适当的取舍、说服客户或领导的能力、推销自己解决方案的能力、突破性格制约的沟通技巧、面向全局思考的思维方式、如何合理动态分配大家的工作项使不被Block住……&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;先写这么多吧，想到了再补充。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2300265.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/24/2300265.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/23/2299232.html</id><title type="text">一个FileSystemWatcher和线程池的问题</title><summary type="text">说下有问题的程序，首先建立一个FileSystemWatcher，监控目录是否有新的文件到达，如果到达了就线程池分配一个线程来读取文件，然后进行后续处理，思路很简单，代码如下： ...</summary><published>2011-12-23T04:55:00Z</published><updated>2011-12-23T04:55:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299232.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299232.html"/><content type="html">&lt;p&gt;说下有问题的程序，首先建立一个FileSystemWatcher，监控目录是否有新的文件到达，如果到达了就线程池分配一个线程来读取文件，然后进行后续处理，思路很简单，代码如下：&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; FileSystemWatcher _watcher;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IntrayWatcher(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; path)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; {           &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     _watcher = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileSystemWatcher&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;                   {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;                       Path = path,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;                       Filter = Constants.Configuration.ExcelFilter,&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;                       NotifyFilter = NotifyFilters.FileName |&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;                                      NotifyFilters.LastWrite |&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;                                      NotifyFilters.CreationTime&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;                   };&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;     _watcher.Created += OnNewFileComesin;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;     _watcher.EnableRaisingEvents = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; OnNewFileComesin(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, FileSystemEventArgs e)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;     Task.Factory.StartNew(() =&amp;gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;               {   &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;                   &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ReadFile(e.FullPath);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;               })&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;               .ContinueWith( &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//....&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;                );&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt; ReadFile(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;    &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var stream = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StreamReader(fullPath))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;    {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//...&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; data;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;    }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;思路很清晰，代码很清晰，实际运行发现一个bug，那就是第一次往文件夹里面Copy一个新文件能正常运行，但是Copy第二个文件的时候就报一个文件正被其他线程占用无法打开的异常：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231255107156.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="12-23-2011 11-53-32" border="0" alt="12-23-2011 11-53-32" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231255135468.png" width="456" height="354" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;想想也想不通，哪里来的其他进程也打开了这个文件，导致文件无法打开？后来发现，原来是FileSystemWatcher有个问题（也可以说bug吧），就是当新文件到达了以后，这个Watcher太灵敏，文件到达了，IO拷贝还没有完成，其Created事件就已经触发了。也就是说，FileSystemWatcher的Created事件不是在新文件到达拷贝完成的时候触发的，而是这个事件在文件一创建还没有IO拷贝完成的时候就触发了。这就造成两个线程在读取同一个文件的异常了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;为什么第二次才出现问题？&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;为什么第一次文件拷贝进来就能正常工作, 而当拷贝进来第二个文件就报异常呢? 而且我还发现第一次即使一次同时拷贝N个文件进来也没有问题。这是为什么？想了一会儿，原来是这样的：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;当第一个文件进来的时候，Task.Factory.StartNew这句话是线程池创建新的线程，这个操作是异步的，创建线程，切换线程需要CPU和内存开销，而且过程又是异步的，所以首次会慢一点，不会抢到IO拷贝的进程。第二个文件进来的时候，由于程序空闲，Task.Factory.StartNew这句话是线程池分配空闲线程（还是原来那个线程号），这个步骤非常快，就抢到IO拷贝的进程。至于为什么第一次即使一次同时拷贝N个文件进来也没有问题，原因是他们并发到来，当时Task.Factory.StartNew这句话是线程池创建N个不同的新的线程。所以原因和一个文件的时候一样。（不知道我理解正确否?）&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;Thread.Sleep()?&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;解决办法很简单了，就是在读取文件前加一行：Thread.Sleep(100); 难道解决问题的办法就是让线程睡觉？看到老外也有这样的，原理一样的：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; WaitForFile(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; fullPath)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (var stream = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StreamReader(fullPath))&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;break&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;             }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             Thread.Sleep(100);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;不知道大家有没有其它办法呢？&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2299232.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299232.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/23/2299168.html</id><title type="text">一个Visual Studio2010的bug&amp;hellip;.</title><summary type="text">今天发现一个VisualStudio2010的bug。是这样的，VS中Project属性有一项是关于Hosting Process的，如果我关闭这个选项，bug就出来了…. 大家知道，.NET...</summary><published>2011-12-23T03:36:00Z</published><updated>2011-12-23T03:36:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299168.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299168.html"/><content type="html">&lt;p&gt;今天发现一个VisualStudio2010的bug。是这样的，VS中Project属性有一项是关于&lt;a href="http://stackoverflow.com/questions/2069940/what-is-the-purpose-of-the-visual-studio-hosting-process" target="_blank"&gt;Hosting Process&lt;/a&gt;的，如果我&lt;a href="http://msdn.microsoft.com/en-us/library/ms185330%28VS.80%29.aspx" target="_blank"&gt;关闭这个选项&lt;/a&gt;，bug就出来了….&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231135583959.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 11-28-26" border="0" alt="12-23-2011 11-28-26" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231135596566.png" width="435" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;大家知道，.NET程序有个App.config/web.config，我现在把它重定向到另外一个位置的配置文件：&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; AppDomain.CurrentDomain.SetData(&lt;span style="color: #006080"&gt;&amp;quot;APP_CONFIG_FILE&amp;quot;&lt;/span&gt;, newCfgFile);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;这样重定向以后你用&lt;code&gt;ConfigurationManager就会发现它会自动读取重定向的配置文件了。&lt;/code&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;code&gt;为了演示，建立一个简单的WindowForms程序，代码：&lt;/code&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; newCfgFile = &lt;span style="color: #006080"&gt;@&amp;quot;C:\2.cfg&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     AppDomain.CurrentDomain.SetData(&lt;span style="color: #006080"&gt;&amp;quot;APP_CONFIG_FILE&amp;quot;&lt;/span&gt;, newCfgFile);&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.textBox1.Text = ConfigurationManager.ConnectionStrings[&lt;span style="color: #006080"&gt;&amp;quot;SqlServices&amp;quot;&lt;/span&gt;].ConnectionString;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; }&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;code&gt;程序App.config内容如下：&lt;/code&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;SqlServices&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;providerName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Persist Security Info=True;timeout=5;Data Source=127.0.0.1;Initial Catalog=abc;User ID=;Password=&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;code&gt;2.cfg内容（重定向的）:&lt;/code&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #800000"&gt;xml&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;SqlServices&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;providerName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Persist Security Info=True;timeout=5;Data Source=127.0.0.2;Initial Catalog=abc;User ID=;Password=&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;&lt;code&gt;注意在debug模式下在VS2010中运行，如果我关闭”Enable Visual Studio Hosting Process”选项的话，取得的值就不对了。虽然重定向成功，但似乎ConfigurationManager还是读取老的配置文件。（如果不是在debug模式下在VS2010中运行，而是直接运行可执行文件*.exe，那就没有问题，所以可以断定是VS2010 debugger 的问题。）&lt;/code&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;PS: 不知道哪位大侠遇到过，似乎MSDN上有关Visual Studio Hosting Process的信息很少很少。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2299168.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299168.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/23/2299141.html</id><title type="text">SSRS进阶系列：报表存储过程如何关联到报表参数</title><summary type="text">首先在报表Layout页面点击菜单 Reports – Report Parameters添加报表参数。然后转到数据tab： 添加存储过程作为数据源，然后可以设置存储过程属性，里面可以添加存储...</summary><published>2011-12-23T03:17:00Z</published><updated>2011-12-23T03:17:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299141.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299141.html"/><content type="html">&lt;p&gt;首先在报表Layout页面点击菜单 Reports &amp;#8211; Report Parameters添加报表参数。然后转到数据tab：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/20111223111654558.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-03-31" alt="12-22-2011 18-03-31" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231116544212.png" width="204" border="0" height="33" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;添加存储过程作为数据源，然后可以设置存储过程属性，里面可以添加存储过程参数，并且可以关联到报表参数：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231116592548.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 11-11-09" alt="12-23-2011 11-11-09" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231117056697.png" width="644" border="0" height="213" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;本文结束。&lt;/p&gt;  &lt;p&gt;注：有关&lt;a href="http://msdn.microsoft.com/en-us/library/ms159106.aspx"&gt;SSRS(SQL Server Reporting Services)&lt;/a&gt;基础知识可以下载&lt;a href="http://files.cnblogs.com/guilin_gavin/SSRS2005%E6%8A%A5%E8%A1%A8%E6%9C%8D%E5%8A%A1%E5%85%A5%E9%97%A8%E6%96%87%E6%A1%A3.doc"&gt;这个&lt;/a&gt;文档。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2299141.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299141.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/23/2299123.html</id><title type="text">SSRS进阶系列：如何做动态参数的折线图(Line Chart)</title><summary type="text">现在报表Layout页面左边工具栏拖一个Chart进来，设置这是一个LineChart（折线图）： 静态折线图不难做，今天要说的是如何实现一个动态参数的折线图。什么意思？报表有个查询参数，是个...</summary><published>2011-12-23T03:08:00Z</published><updated>2011-12-23T03:08:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299123.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299123.html"/><content type="html">&lt;p&gt;现在报表Layout页面左边工具栏拖一个Chart进来，设置这是一个LineChart（折线图）：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231107063706.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-46-38" alt="12-23-2011 10-46-38" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231107316381.png" width="644" border="0" height="191" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;静态折线图不难做，今天要说的是如何实现一个动态参数的折线图。什么意思？报表有个查询参数，是个多选下拉框，选中的N个就是上图里面的Series，就是那几根折线。怎么实现？&lt;/p&gt;  &lt;p&gt;带多选下拉框的报表参数运行的时候长这样（&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298283.html" target="_blank"&gt;如何实现&lt;/a&gt;）：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231107385405.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-12-41" alt="12-22-2011 18-12-41" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231107397140.png" width="176" border="0" height="174" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;这个实现有些难度。关键难在哪里？你做报表应该明白两个东西，Fields（那个数据源/QueryString/StoreProcedure的输出的域就是Fields），Parameters（报表的参数）。如果我们要实现折线图的N根（Series）是动态的从Parameters（报表的参数）获取，这个比较困难。所以我们必须转换下思路，不从Parameters（报表的参数）获取，而是让QueryString/StoreProcedure的输出的域里面包含这个信息，也就是说让QueryString/StoreProcedure的输出的域包含X轴、Y轴和Series（N根折线）等所有信息。具体的存储过程我就不贴了，比较复杂。&lt;/p&gt;  &lt;p&gt;讲一下折线图里面的设置吧，重点是Data那个tab页面的设置，如图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231107434047.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-57-42" alt="12-23-2011 10-57-42" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231108195860.png" width="519" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;上面说了，我们不从Parameters（报表的参数）获取，而是让QueryString/StoreProcedure的输出的域里面包含这个信息，按以上这些设置就简单了，基本都是&lt;strong&gt;Fields!abc.value&lt;/strong&gt;，或者基于这个的表达式（Expression）。这里说一下上面几个域的含义：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Values: 当然是折线图中各个点的值了（Y轴）&lt;/li&gt;    &lt;li&gt;Category Groups：x轴&lt;/li&gt;    &lt;li&gt;Series Groups: 哪几个折线，最右边的图示&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;重点是你的存储过程必须输出以上这些Fields（X轴、Y轴和折线）。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;本文结束。&lt;/p&gt;  &lt;p&gt;注：有关&lt;a href="http://msdn.microsoft.com/en-us/library/ms159106.aspx"&gt;SSRS(SQL Server Reporting Services)&lt;/a&gt;基础知识可以下载&lt;a href="http://files.cnblogs.com/guilin_gavin/SSRS2005%E6%8A%A5%E8%A1%A8%E6%9C%8D%E5%8A%A1%E5%85%A5%E9%97%A8%E6%96%87%E6%A1%A3.doc"&gt;这个&lt;/a&gt;文档。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2299123.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299123.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/23/2299031.html</id><title type="text">SSRS进阶系列：如何做多级Groups并且自动展开</title><summary type="text">所谓多级Groups就是带树状结构(+-)的多层Groups，类似这种效果，还要能自动展开 首先是数据集（数据源）里面的QueryString或者存储过程不要带Group By。然后在新建报表...</summary><published>2011-12-23T02:40:00Z</published><updated>2011-12-23T02:40:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299031.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299031.html"/><content type="html">&lt;p&gt;所谓多级Groups就是带树状结构(+-)的多层Groups，类似这种效果，还要能自动展开&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039344730.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-12-21" alt="12-23-2011 10-12-21" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039351482.png" width="644" border="0" height="150" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;首先是数据集（数据源）里面的QueryString或者存储过程不要带Group By。然后在新建报表的向导里面添加多个（多层）Groups：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039377470.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-18-26" alt="12-23-2011 10-18-26" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039384537.png" width="499" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;下一步选中这些选项：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039382095.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-20-01" alt="12-23-2011 10-20-01" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039396338.png" width="644" border="0" height="306" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;这样就可以显示多层Groups的表格了。&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;但你会发现这些层级树状结构都不能自动展开，需要用户一个个点击+号，如果节点很多的话就很不方便了。所以下一步是如何让层级自动展开？&lt;/p&gt;  &lt;p&gt;首先转到Layout页面，点击菜单 Reports &amp;#8211; Report Parameters，给报表加个查询参数，让用户选择是否默认自动展开。这个参数定义这样：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039407866.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-23-06" alt="12-23-2011 10-23-06" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039414933.png" width="515" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;然后鼠标单击表格第一个Group那一行的第一个单元格：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039427507.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-26-24" alt="12-23-2011 10-26-24" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039438130.png" width="233" border="0" height="121" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;在属性里面设置InitialToggleState属性为这样的表达式：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/20111223103944737.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-25-14" alt="12-23-2011 10-25-14" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/20111223103945313.png" width="644" border="0" height="205" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;然后鼠标单击表格的第二个Group那一行的行头，选中第二个Group鼠标右键选择 Edit Group&amp;#8230;.打开以后到 Visibility页面，这样设置：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039465428.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-30-19" alt="12-23-2011 10-30-19" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039476640.png" width="556" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;如果下一级也要自动展开，原理同上面一级，注意设置上一级Parent Group的首单元格的名称。&lt;/p&gt;  &lt;p&gt;如果你设置了所有的级别都可以根据报表参数是否自动展开，就可以很方便的再添加一个按钮&amp;#8220;展开所有（Expand all）&amp;#8221;，点击这个textbox设置属性，链接到我们前面添加的那个参数即可。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039504396.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-23-2011 10-36-48" alt="12-23-2011 10-36-48" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112231039519545.png" width="610" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;本文结束。（以上SSRS针对SQLServer2005，如果是2008的可以参考&lt;a href="http://www.sqlchick.com/entries/2010/9/19/expand-or-collapse-all-grouped-items-on-ssrs-report.html" target="_blank"&gt;这篇&lt;/a&gt;文章）&lt;/p&gt;  &lt;p&gt;注：有关&lt;a href="http://msdn.microsoft.com/en-us/library/ms159106.aspx"&gt;SSRS(SQL Server Reporting Services)&lt;/a&gt;基础知识可以下载&lt;a href="http://files.cnblogs.com/guilin_gavin/SSRS2005%E6%8A%A5%E8%A1%A8%E6%9C%8D%E5%8A%A1%E5%85%A5%E9%97%A8%E6%96%87%E6%A1%A3.doc"&gt;这个&lt;/a&gt;文档。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2299031.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/23/2299031.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/22/2298283.html</id><title type="text">SSRS进阶系列：报表查询参数如何支持复选下拉框</title><summary type="text">报表查询参数如何支持复选下拉框呢？就像这样： 首先要在Data页面加一个数据集，取得这个列表： 加了这个DataSet以后转到Layout页面，菜单Report – Report Pa...</summary><published>2011-12-22T10:22:00Z</published><updated>2011-12-22T10:22:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298283.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298283.html"/><content type="html">&lt;p&gt;报表查询参数如何支持复选下拉框呢？就像这样：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221821354960.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-12-41" alt="12-22-2011 18-12-41" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221821358058.png" border="0" height="174" width="176" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;首先要在Data页面加一个数据集，取得这个列表：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221821356454.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-03-31" alt="12-22-2011 18-03-31" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221821368996.png" border="0" height="33" width="204" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;加了这个DataSet以后转到Layout页面，菜单Report &amp;#8211; Report Parameters进入报表参数页面。加一个parameter参数，这样配置：（注意Dataset只有一个Field）&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/20111222182138274.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-15-31" alt="12-22-2011 18-15-31" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221821423244.png" border="0" height="484" width="515" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;整个报表用存储过程作为数据源，这个存储过程必须有个参数来接受这个报表的参数：&lt;/p&gt;  &lt;p&gt;@QueryParam NVARCHAR(MAX)&lt;/p&gt;  &lt;p&gt;这个存储过程里面要Split逗号分隔的内容，SQLServer加个Function来Split逗号分隔的字符串&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;FUNCTION&lt;/span&gt; [dbo].[_SplitString]     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; (     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     @sString nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;),     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     @cDelimiter &lt;span style="color: #0000ff"&gt;nchar&lt;/span&gt;(1)     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; )     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;RETURNS&lt;/span&gt; @tParts &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; ( part nvarchar(&lt;span style="color: #0000ff"&gt;max&lt;/span&gt;) )     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AS&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; @sString &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;DECLARE&lt;/span&gt;     @iStart &lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;,     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;                 @iPos &lt;span style="color: #0000ff"&gt;INT&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;( @sString, 1, 1 ) = @cDelimiter      &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;     @iStart = 2     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         INSERT &lt;span style="color: #0000ff"&gt;INTO&lt;/span&gt; @tParts     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;VALUES&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; )     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;    &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;      &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt; @iStart = 1     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;WHILE&lt;/span&gt; 1=1     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;BEGIN&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;     @iPos = CHARINDEX( @cDelimiter, @sString, @iStart )     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; @iPos = 0     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;     @iPos = LEN( @sString )+1     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;IF&lt;/span&gt; @iPos - @iStart &amp;gt; 0                       &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;                 INSERT &lt;span style="color: #0000ff"&gt;INTO&lt;/span&gt; @tParts     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;VALUES&lt;/span&gt;  ( &lt;span style="color: #0000ff"&gt;SUBSTRING&lt;/span&gt;( @sString, @iStart, @iPos-@iStart ))     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;ELSE&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;                 INSERT &lt;span style="color: #0000ff"&gt;INTO&lt;/span&gt; @tParts     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;VALUES&lt;/span&gt;( &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; )     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;     @iStart = @iPos+1     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; @iStart &amp;gt; len( @sString )      &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;BREAK&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;RETURN&lt;/span&gt;     &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;      &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&#xD;
&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;END&lt;/span&gt;    &lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;在存储过程里面调用这个函数：&lt;/p&gt;&#xD;
&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&#xD;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&#xD;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;SELECT&lt;/span&gt; Part &lt;span style="color: #0000ff"&gt;FROM&lt;/span&gt; _SplitString(@QueryParam , &lt;span style="color: #006080"&gt;','&lt;/span&gt;)&lt;/pre&gt;&#xD;
&lt;!--CRLF--&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;然后把它存到临时表或表变量就可以后续处理了。整个思路就是这样。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;本文结束。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;注：有关&lt;a href="http://msdn.microsoft.com/en-us/library/ms159106.aspx" target="_blank"&gt;SSRS(SQL Server Reporting Services)&lt;/a&gt;基础知识可以下载&lt;a href="http://files.cnblogs.com/guilin_gavin/SSRS2005%E6%8A%A5%E8%A1%A8%E6%9C%8D%E5%8A%A1%E5%85%A5%E9%97%A8%E6%96%87%E6%A1%A3.doc" target="_blank"&gt;这个&lt;/a&gt;文档。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2298283.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298283.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/22/2298272.html</id><title type="text">SSRS进阶系列：如何获得当前连接的数据库</title><summary type="text">如何在报表中显示当前连接的数据库？就像这样： 为什么要显示这个信息，因为报表有可能被导出为excel，这样别人就可以知道当时这个报表运行的一些参数(如连接哪个数据库)信息。 实现很简单，就是...</summary><published>2011-12-22T10:09:00Z</published><updated>2011-12-22T10:09:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298272.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298272.html"/><content type="html">&lt;p&gt;如何在报表中显示当前连接的数据库？就像这样：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221808552107.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-01-28" alt="12-22-2011 18-01-28" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221808567156.png" border="0" height="71" width="339" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;为什么要显示这个信息，因为报表有可能被导出为excel，这样别人就可以知道当时这个报表运行的一些参数(如连接哪个数据库)信息。&lt;/p&gt;  &lt;p&gt;实现很简单，就是加一个数据源即可，在Data页面：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/20111222180856254.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-03-31" alt="12-22-2011 18-03-31" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221808582993.png" border="0" height="33" width="204" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;添加一个新的数据集，查询字符串（Query String）填写这个：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;nbsp; SELECT DB_NAME() AS DataBaseName&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;然后在要显示的label右键点击&amp;#8220;Expression&amp;#8221;表达式，弹出表达式编辑框，选择DataSet &amp;#8211;&amp;gt; 刚才那个加的数据集&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221809004063.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="12-22-2011 18-06-22" alt="12-22-2011 18-06-22" src="http://images.cnblogs.com/cnblogs_com/Mainz/201112/201112221809011339.png" border="0" height="441" width="499" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;本文结束。&lt;/p&gt;  &lt;p&gt;注：有关&lt;a href="http://msdn.microsoft.com/en-us/library/ms159106.aspx" target="_blank"&gt;SSRS(SQL Server Reporting Services)&lt;/a&gt;基础知识可以下载&lt;a href="http://files.cnblogs.com/guilin_gavin/SSRS2005%E6%8A%A5%E8%A1%A8%E6%9C%8D%E5%8A%A1%E5%85%A5%E9%97%A8%E6%96%87%E6%A1%A3.doc" target="_blank"&gt;这个&lt;/a&gt;文档。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2298272.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/22/2298272.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2011/12/16/2290686.html</id><title type="text">[转]MVVM框架和误区</title><summary type="text">Model-View-ViewModel 是一种架构模式，主要在 WPF、Silverlight 和 WP7 开发里使用，它的目标是从视图层移除几乎所有代码隐藏（code-behind）。交互设计师可以专注于使用 XAML 表达用户体验需求，然后创建和视图模型的绑定，而视图模型则是由应用程序开发者开发和维护的。 MVVM 是更加通用的 Presentation 模式的一个具体实现。MVVM 视图模型包含概念模型而不是数据模型，所有业务逻辑和其它操作都是在模型和视图模型里完成的。有很多框架可以做到这点，其中一些是： 开源的 PRISM：由微软提供，和 MEF/Unity 一起用于...</summary><published>2011-12-16T12:50:00Z</published><updated>2011-12-16T12:50:00Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Mainz/archive/2011/12/16/2290686.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2011/12/16/2290686.html"/><content type="html">&lt;div&gt;　&lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;Model-View-ViewModel&lt;/a&gt;  是一种架构模式，主要在 WPF、Silverlight 和 WP7  开发里使用，它的目标是从视图层移除几乎所有代码隐藏（code-behind）。交互设计师可以专注于使用 XAML  表达用户体验需求，然后创建和视图模型的绑定，而视图模型则是由应用程序开发者开发和维护的。 &lt;p&gt;MVVM 是更加通用的 &lt;a href="http://www.infoq.com/presentations/Presentation-Patterns-MVP-MVC-MVVM;jsessionid=DF5AA4EE3D3FD80A1376E92C5D47FBAA"&gt;Presentation&lt;/a&gt; 模式的一个具体实现。MVVM 视图模型包含概念模型而不是数据模型，所有业务逻辑和其它操作都是在模型和视图模型里完成的。有很多框架可以做到这点，其中一些是：&lt;/p&gt; &lt;p&gt;&lt;strong&gt;开源的&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://compositewpf.codeplex.com/"&gt;PRISM&lt;/a&gt;：由微软提供，和 MEF/Unity 一起用于依赖注入，支持组合命令，&lt;a href="http://msdn.microsoft.com/en-us/library/gg430866%28v=PandP.40%29.aspx"&gt;可以扩展&lt;/a&gt;。&lt;a href="http://msdn.microsoft.com/en-us/library/gg406140.aspx"&gt;MSDN&lt;/a&gt; 上有详细的教程和演练。&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mvvmlight.codeplex.com/"&gt;MVVM Light Toolkit&lt;/a&gt;：有 visual Studio 和 Expression Blend 的项目和项的模板。更多信息请看&lt;a href="http://www.galasoft.ch/mvvm/"&gt;这里&lt;/a&gt;，另外可以参考 &lt;a href="http://www.galasoft.ch/mvvm/creating/"&gt;VS&lt;/a&gt; 和 &lt;a href="http://www.galasoft.ch/mvvm/creatingblend/"&gt;Expression Blend&lt;/a&gt; 的使用教程。&lt;/li&gt;&lt;li&gt;&lt;a href="http://caliburnmicro.codeplex.com/"&gt;Caliburn Micro&lt;/a&gt;：支持视图模型先行（ViewModel-First）和视图先行（View-First）两种开发方式，通过 co-routine 支持异步编程。&lt;/li&gt;&lt;li&gt;&lt;a href="http://simplemvvmtoolkit.codeplex.com/"&gt;Simple MVVM Toolkit&lt;/a&gt;：提供 VS 项目和项的模板，依赖注入，支持深拷贝以及模型和视图模型之间的属性关联。&lt;/li&gt;&lt;li&gt;&lt;a href="http://catel.codeplex.com/"&gt;Catel&lt;/a&gt;：包含项目和项的模板，用户控件和企业类库。支持动态视图模型注入，视图模型的延迟加载和验证。还支持 WP7 专用的视图模型服务。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;闭源的&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Intersoft &lt;a href="http://www.clientui.com/"&gt;ClientUI&lt;/a&gt;：付费的，只支持 WPF 和 Silverlight，但是，除了 MVVM 框架，它还提供&lt;a href="http://www.clientui.com/Comparison.aspx"&gt;其它一些特性&lt;/a&gt;。&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vidyano.com/"&gt;Vidyano&lt;/a&gt;：免费但不开源。带有实体映射/虚拟持久化对象（数据容器），业务规则以及内置基于 ACL 的安全特性。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;若想了解 MVVM，可以参考以下资料：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Laurent Bugnion 的&lt;a href="http://channel9.msdn.com/events/MIX/MIX10/EX14"&gt;《Understanding MVVM Pattern》&lt;/a&gt;和&lt;a href="http://channel9.msdn.com/events/MIX/MIX11/OPN03"&gt;《Deep Dive MVVM》&lt;/a&gt;&lt;/li&gt;&lt;li&gt;微软 Silverlight 组的&lt;a href="http://www.silverlight.net/learn/advanced-techniques/the-mvvm-pattern/using-the-mvvm-pattern-in-silverlight-applications"&gt;《Understanding the MVVM Pattern in Silverlight Applications》&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Erik Lebel 在 InfoQ 上的视频演讲&lt;a href="http://www.infoq.com/presentations/Presentation-Patterns-MVP-MVC-MVVM;jsessionid=DF5AA4EE3D3FD80A1376E92C5D47FBAA"&gt;《Presentation Pattern》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;使用 MVVM 的最大好处之一是分离关注点，以便用户体验设计师和应用程序开发者可以并行工作。另一方面，相关的担忧包括它对于 UI 操作比较简单的情况有点杀鸡用牛刀的感觉，数据绑定有点难以调试，以及大量使用数据绑定可能带来性能问题等等。&lt;/p&gt; &lt;p&gt;Jonathan Allen 在评论里提到几点错误使用 MVVM 的征兆：&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1. 你的模型和视图模型名字相同。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;视图模型不应该是对模型的包装。视图模型的职责是外部服务的请求中介，比如加载和保存数据。而数据本身，以及验证和大多数业务逻辑应该放在模型里。&lt;/p&gt; &lt;p&gt;我经常强调这点。每当你创建一个视图模型包装一个模型，你就在你的 API  里引入一个巨大漏洞。具体地，任何直接引用这个模型的东西都可能以视图模型无法察觉的方式改变某个属性，因此 UI  也不会有相应的改变。同样地，模型里计算字段的任何更改也不会回传给视图模型。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;2. 你的视图和视图模型名字相同。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;理想的情况下，视图模型是不知道使用它们的视图的，尤其是 WPF 应用程序有多个窗口共享相同的视图模型。&lt;/p&gt; &lt;p&gt;对于比较小型的应用程序来说，整个应用程序可能只需一个视图模型。对于比较大型的应用程序来说，主要功能可能需要一个视图模型，每个次要方面也需要一个，比如配置管理。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;3. 你没有代码隐藏。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;代码隐藏既非一个好的东西，亦非一个坏的东西。它只是一个用来放置和视图或控件相关的逻辑的地方。因此，当我看到一个视图没有任何代码隐藏，我就会马上检查是否存在以下问题：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;视图模型是否通过名字接触了特定的控件？&lt;/li&gt;&lt;li&gt;视图模型是否通过命令参数访问控件？&lt;/li&gt;&lt;li&gt;是否使用了 EventToCommand 或其它可以导致泄露的行为而不是简单的事件处理程序？&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;MVVM Light 的 EventToCommand 很有问题，因为它会使得控件从屏幕移除之后无法被垃圾回收。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;4. 视图模型监听属性更改通知&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;如果一个模型的的生命周期比监听它的事件的视图模型长，那么可能导致内存泄露。不同于视图有个 Unloaded 事件，视图模型对于生命周期管理没有很好的方案。因此如果它们关联到存活期比它们更长的视图模型的事件，视图模型将会出现泄露。&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;查看英文原文：&lt;/strong&gt;&lt;a href="http://www.infoq.com/news/2011/12/mvvm-frameworks-net;jsessionid=DF5AA4EE3D3FD80A1376E92C5D47FBAA"&gt;MVVM Frameworks For .NET&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2290686.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2011/12/16/2290686.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
