<?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-05-15T03:06:37Z</updated><author><name>Mainz</name><uri>http://www.cnblogs.com/Mainz/</uri></author><generator>feed.cnblogs.com</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/05/15/2501107.html</id><title type="text">Cannot start Tomcat to debug in Eclips - tomcat localhost-config is missing, &amp;#39;Starting Tomcat v7.0 Server at localhost&amp;#39; has encountered a problem.</title><summary type="text">在Eclipse的JavaEE环境中，点击run下拉run as- run on server, 选择index.jsp，启动tomcat调试失败，错误信息：Tomcat localhost-config is missing, 'Starting Tomcat v7.0 Server at localhost' has encountered a problem.如何解决？</summary><published>2012-05-15T02:49:00Z</published><updated>2012-05-15T02:49: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/05/15/2501107.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/05/15/2501107.html"/><content type="html">&lt;p&gt;在Eclipse的JavaEE环境中，点击run下拉run as- run on server, 选择index.jsp，启动tomcat调试失败，错误信息：Tomcat localhost-config is missing, 'Starting Tomcat v7.0 Server at localhost' has encountered a problem.如何解决？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Services，stop Tomcat service，otherwise the port will be in using。&lt;/li&gt;&lt;li&gt;JavaEE Servers tab page, remove all existing...then create a new server of Tomcat7.0 server, finish&lt;/li&gt;&lt;li&gt;Double click on the "Tomcat7" entry to see the configuration.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Then click on the "Open launch configuration" link in the "General information" block.&lt;/li&gt;&lt;li&gt;In the dialog, select the "Classpath" tab.&lt;/li&gt;&lt;li&gt;At "Bootstrap entries", Click the "Add external jar" button.&lt;/li&gt;&lt;li&gt;Select the file "/usr/share/tomcat6/bin/tomcat-juli.jar" (Use Everything to locate the file)&lt;/li&gt;&lt;li&gt;Click "Apply", Close the dialog.&lt;/li&gt;&lt;li&gt;Start tomcat 7 from Eclipse.10. Debug breakpoints:&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select index.jsp, &lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set break point in controller classes.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Click eclips menu: "Run - Debug as - Debug on server"&lt;/p&gt; &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2501107.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/05/15/2501107.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/04/28/2475482.html</id><title type="text">体验微软SkyDrive的HTML5</title><summary type="text">微软的SkyDrive.com提供了云存储服务（文件、照片和视频等），免费用户是25G空间，更大的空间是收费的。原来SkyDrive是用Silverlight做的，2011年放弃Silverlight转向HTML5。今天体验了一下他的HTML5....</summary><published>2012-04-28T09:23:00Z</published><updated>2012-04-28T09:23: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/04/28/2475482.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/04/28/2475482.html"/><content type="html">&lt;p&gt; 微软的&lt;a href="http://skydrive.com/"&gt;SkyDrive.com&lt;/a&gt;提供了云存储服务（文件、照片和视频等），免费用户是25G空间，更大的空间是收费的。原来SkyDrive是用Silverlight做的，2011年放弃Silverlight转向HTML5。今天体验了一下他的HTML5。我在手机上浏览器输入&lt;a href="http://skydrive.com/"&gt;SkyDrive.com&lt;/a&gt;，用hotmail或者msn账户登录，即可用滑屏浏览照片和视频等等，HTML5还是很流畅的。如果你没有手机，也可以在Firefox上安装一个&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/"&gt;user agent switcher插件&lt;/a&gt;，然后选择iPhone 4s，访问&lt;a href="http://skydrive.com/"&gt;SkyDrive.com&lt;/a&gt;，就可以看到iPhone 4s访问&lt;a href="http://skydrive.com/"&gt;SkyDrive.com&lt;/a&gt;的效果（当然，手指滑动效果是没法体验了）。此外，微软还提供了iOS和WP的SkyDrive的NativeAPP，也就是说微软是HTML5和NativeAPP双面下注的。这一点值得我们学习。毕竟现在HTML5还是有很多问题，几个业界老大的标准各不相同，导致开发者和创业者有点头大。题外话：当前在中国，Google的各种服务几乎都面临被墙的局面，访问极其不稳定，非常悲剧。而微软和和中国政府关系好，其云服务访问还是稳定的。这也是我用SkyDrive的原因。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://skydrive.com/"&gt;SkyDrive.com&lt;/a&gt;的HTML5特性一览&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;strong&gt;Site&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;New layout, look and feel, and site architecture &lt;/li&gt;     &lt;li&gt;SSL enabled on all authenticated pages &lt;/li&gt;     &lt;li&gt;Clean urls (removed most of the junk from the URLs) &lt;/li&gt;     &lt;li&gt;SkyDrive can now be pinned to your Windows 7 taskbar with jump lists (IE9) &lt;/li&gt;     &lt;li&gt;Header now says SkyDrive &lt;/li&gt;     &lt;li&gt;What&amp;#8217;s new feed for docs and photos remove &lt;/li&gt;     &lt;li&gt;Upload file size limit now 100MB &lt;/li&gt;     &lt;li&gt;Moved to edge-to-edge layout to take advantage of larger screens &lt;/li&gt;     &lt;li&gt;Reduced size of header to give more room to your content &lt;/li&gt;     &lt;li&gt;&lt;span style="color: red;"&gt;HTML5 file API support for upload &lt;/span&gt;&lt;br /&gt;     &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Photos&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;Brand new photos experience &lt;/li&gt;     &lt;li&gt;&lt;span style="color: red;"&gt;HTML5 video playback &lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span style="color: red;"&gt;Photo slideshow&lt;br /&gt;     &lt;/span&gt;&lt;/li&gt;     &lt;li&gt;Thumbnails generated for H.264 Video &lt;/li&gt;     &lt;li&gt;&lt;span style="color: red;"&gt;CSS3 Transitions for albums and 1-up view &lt;/span&gt;&lt;/li&gt;     &lt;li&gt;Photo album thumbnails now "pulse" &lt;/li&gt;     &lt;li&gt;Thumbnails generated for all photo sizes (previously limited to 5000px) &lt;/li&gt;     &lt;li&gt;Support for aspect ratio thumbnails (including panorama) &lt;/li&gt;     &lt;li&gt;&lt;span style="color: red;"&gt;Support for Touch APIs for Safari/IE10&lt;/span&gt;&lt;br /&gt;     &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Docs&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;Icons for PDF filetypes &lt;/li&gt;     &lt;li&gt;Recent documents includes more items &lt;/li&gt;     &lt;li&gt;Open in Office Client from SkyDrive now gives you the option to install Office 2010 trial using &lt;a href="http://office.microsoft.com/en-us/excel-help/click-to-run-introduction-HA101850493.aspx"&gt;Click-to-Run technology&lt;/a&gt; &lt;/li&gt;     &lt;li&gt;Performance improvements to the Office Web Apps in IE9 &lt;/li&gt;     &lt;li&gt;Details view now supports touch &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Groups&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;SkyDrive groups now appear in the left nav giving you one click access to Group content &lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;The update is live now and can be found at &lt;a href="http://skydrive.com/" target="_blank"&gt;Skydrive.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;与SkyDrive配合使用的移动应用&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;与SkyDrive配合使用的移动应用：&lt;a href="https://apps.live.com/skydrive/allapps"&gt;https://apps.live.com/skydrive/allapps&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SkyDrive桌面客户端&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="https://apps.live.com/skydrive"&gt;https://apps.live.com/skydrive&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2475482.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/04/28/2475482.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/04/14/2447786.html</id><title type="text">Spring MVC+Ant+Tomcat+Eclipse最简单的demo</title><summary type="text">第一步是Java的Web环境搭建，下载Eclipse，下载Tomcat，下载JDK，下载Spring，注意安装Tomcat的时候配置一下管理员账号和密码（如Tomcat/s3cret），安装好了Tom...</summary><published>2012-04-14T14:52:00Z</published><updated>2012-04-14T14:52: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/04/14/2447786.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/04/14/2447786.html"/><content type="html">&lt;p&gt;第一步是Java的Web环境搭建，下载&lt;a href="http://www.eclipse.org/downloads/" target="_blank"&gt;Eclipse&lt;/a&gt;（或者更好的但收费的IDE-&lt;a href="http://www.jetbrains.com/idea/" target="_blank"&gt;IntelliJ Idea&lt;/a&gt;，和&lt;a target="_blank" href="http://www.jetbrains.com/resharper/"&gt;Resharper&lt;/a&gt;一家公司出的），下载&lt;a href="http://tomcat.apache.org/" target="_blank"&gt;Tomcat&lt;/a&gt;，下载&lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank"&gt;JDK&lt;/a&gt;，下载&lt;a href="http://www.springsource.org/download" target="_blank"&gt;Spring&lt;/a&gt;，注意安装Tomcat的时候配置一下管理员账号和密码（如Tomcat/s3cret），安装好了Tomcat以后应该可以在浏览器访问这个地址：&lt;a title="http://localhost:8080/" href="http://localhost:8080/"&gt;http://localhost:8080/&lt;/a&gt;（或者其它端口如9090你可以自己制定），点击里面的manager链接可以进入Tomcat管理manager页面 &lt;a title="http://localhost:8080/manager/html" href="http://localhost:8080/manager/html"&gt;http://localhost:8080/manager/html&lt;/a&gt;：&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML2c995f6" alt="SNAGHTML2c995f6" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251354332.png" data-pinit="registered" height="484" width="618" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Eclilpse相关设置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先是&lt;a href="http://xinswy.blog.hexun.com/62054394_d.html" target="_blank"&gt;环境变量设置&lt;/a&gt;，然后要把tools.jar添加到Eclipse的Ant运行时里面去：window-&amp;gt;preferences-&amp;gt;ant-&amp;gt; runtime, Global entries, add: external jars: jdk7的安装路径/lib/tools.jar。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;建立一个Spring MVC的程序+Ant+Tomcat&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在Eclipse的java环境下（非JavaEE下）建立一个空的java项目（无需选择dynamic web project），名字叫springapp，然后加个目录叫war（便于部署），建立了就是这样的：&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251443894.png" data-pinit="registered" height="210" width="201" border="0" /&gt;&lt;/p&gt;&lt;p&gt;然后在整个项目下添加build.xml(自动用Ant编译和部署用的，类似makefile，这玩意爽),build.xml内容如下：&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&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;="1.0"&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&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;project&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="springapp"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;basedir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="."&lt;/span&gt; &lt;span style="color: #ff0000"&gt;default&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="usage"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;file&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="build.properties"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&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;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="src.dir"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="src"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="web.dir"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="war"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="build.dir"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${web.dir}/WEB-INF/classes"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="name"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="springapp"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;path&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="master-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${web.dir}/WEB-INF/lib"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;include&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="*.jar"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- We need the servlet API classes: --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- * for Tomcat 5/6 use servlet-api.jar --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- * for other app servers - check the docs --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${appserver.lib}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;include&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="servlet*.jar"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum20"&gt; 20:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum21"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;pathelement&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${build.dir}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum22"&gt; 22:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum23"&gt; 23:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum24"&gt; 24:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="usage"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum25"&gt; 25:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=""&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum26"&gt; 26:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${name} build file"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum27"&gt; 27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="-----------------------------------"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum28"&gt; 28:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=""&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum29"&gt; 29:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Available targets are:"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum30"&gt; 30:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=""&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum31"&gt; 31:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;build&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Build the application"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum32"&gt; 32:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;deploy&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Deploy application as directory"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum33"&gt; 33:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;deploywar&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Deploy application as a WAR file"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum34"&gt; 34:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;install&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Install application in Tomcat"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum35"&gt; 35:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;reload&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Reload application in Tomcat"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum36"&gt; 36:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;start&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Start Tomcat application"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum37"&gt; 37:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;stop&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Stop Tomcat application"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum38"&gt; 38:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;="&lt;span style="color: #ff0000"&gt;list&lt;/span&gt; &lt;span style="color: #ff0000"&gt;--&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; List Tomcat applications"&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum39"&gt; 39:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000"&gt;message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=""&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum40"&gt; 40:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum41"&gt; 41:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum42"&gt; 42:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- Create folder in tomcat&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum43"&gt; 43:&lt;/span&gt; &lt;span style="color: #008000"&gt; &amp;lt;target name="init"&amp;gt; &lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum44"&gt; 44:&lt;/span&gt; &lt;span style="color: #008000"&gt; &amp;lt;mkdir dir="${deploy.path}/springapp"/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum45"&gt; 45:&lt;/span&gt; &lt;span style="color: #008000"&gt; &amp;lt;/target&amp;gt; --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum46"&gt; 46:&lt;/span&gt; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum47"&gt; 47:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="build"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Compile main source tree java files"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum48"&gt; 48:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;mkdir&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${build.dir}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum49"&gt; 49:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;javac&lt;/span&gt; &lt;span style="color: #ff0000"&gt;destdir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${build.dir}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;source&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.5"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1.5"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;debug&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum50"&gt; 50:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;deprecation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;optimize&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;failonerror&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum51"&gt; 51:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;src&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${src.dir}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum52"&gt; 52:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;classpath&lt;/span&gt; &lt;span style="color: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="master-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum53"&gt; 53:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;javac&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum54"&gt; 54:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum55"&gt; 55:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum56"&gt; 56:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="deploy"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;depends&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="build"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Deploy application"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum57"&gt; 57:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;copy&lt;/span&gt; &lt;span style="color: #ff0000"&gt;todir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${deploy.path}/${name}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;preservelastmodified&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum58"&gt; 58:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${web.dir}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum59"&gt; 59:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;include&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="**/*.*"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum60"&gt; 60:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum61"&gt; 61:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;copy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum62"&gt; 62:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum63"&gt; 63:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum64"&gt; 64:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="deploywar"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;depends&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="build"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Deploy application as a WAR file"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum65"&gt; 65:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;war&lt;/span&gt; &lt;span style="color: #ff0000"&gt;destfile&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${name}.war"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum66"&gt; 66:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;webxml&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${web.dir}/WEB-INF/web.xml"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum67"&gt; 67:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${web.dir}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum68"&gt; 68:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;include&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="**/*.*"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum69"&gt; 69:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum70"&gt; 70:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;war&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum71"&gt; 71:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;copy&lt;/span&gt; &lt;span style="color: #ff0000"&gt;todir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${deploy.path}"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;preservelastmodified&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="true"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum72"&gt; 72:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="."&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum73"&gt; 73:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;include&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="*.war"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum74"&gt; 74:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum75"&gt; 75:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;copy&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum76"&gt; 76:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum77"&gt; 77:&lt;/span&gt; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum78"&gt; 78:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- ============================================================== --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum79"&gt; 79:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- Tomcat tasks - remove these if you don't have Tomcat installed --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum80"&gt; 80:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- ============================================================== --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum81"&gt; 81:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum82"&gt; 82:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;path&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum83"&gt; 83:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- We need the Catalina jars for Tomcat --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum84"&gt; 84:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- * for other app servers - check the docs --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum85"&gt; 85:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt; &lt;span style="color: #ff0000"&gt;dir&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${appserver.lib}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum86"&gt; 86:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;include&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant.jar"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum87"&gt; 87:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;fileset&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum88"&gt; 88:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum89"&gt; 89:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum90"&gt; 90:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="install"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;classname&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.apache.catalina.ant.InstallTask"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum91"&gt; 91:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;classpath&lt;/span&gt; &lt;span style="color: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum92"&gt; 92:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum93"&gt; 93:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="reload"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;classname&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.apache.catalina.ant.ReloadTask"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum94"&gt; 94:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;classpath&lt;/span&gt; &lt;span style="color: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum95"&gt; 95:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum96"&gt; 96:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="list"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;classname&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.apache.catalina.ant.ListTask"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum97"&gt; 97:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;classpath&lt;/span&gt; &lt;span style="color: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum98"&gt; 98:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum99"&gt; 99:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="start"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;classname&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.apache.catalina.ant.StartTask"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum100"&gt; 100:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;classpath&lt;/span&gt; &lt;span style="color: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum101"&gt; 101:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum102"&gt; 102:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="stop"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;classname&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.apache.catalina.ant.StopTask"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum103"&gt; 103:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;classpath&lt;/span&gt; &lt;span style="color: #ff0000"&gt;refid&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum104"&gt; 104:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum105"&gt; 105:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum106"&gt; 106:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="install"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Install application in Tomcat"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum107"&gt; 107:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;install&lt;/span&gt; &lt;span style="color: #ff0000"&gt;url&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.url}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum108"&gt; 108:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;username&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.username}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum109"&gt; 109:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;password&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.password}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum110"&gt; 110:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/${name}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum111"&gt; 111:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;war&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${name}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum112"&gt; 112:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum113"&gt; 113:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum114"&gt; 114:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="reload"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Reload application in Tomcat"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum115"&gt; 115:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;reload&lt;/span&gt; &lt;span style="color: #ff0000"&gt;url&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.url}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum116"&gt; 116:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;username&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.username}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum117"&gt; 117:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;password&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.password}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum118"&gt; 118:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/${name}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum119"&gt; 119:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum120"&gt; 120:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum121"&gt; 121:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="start"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Start Tomcat application"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum122"&gt; 122:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;start&lt;/span&gt; &lt;span style="color: #ff0000"&gt;url&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.url}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum123"&gt; 123:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;username&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.username}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum124"&gt; 124:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;password&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.password}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum125"&gt; 125:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/${name}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum126"&gt; 126:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum127"&gt; 127:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum128"&gt; 128:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="stop"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Stop Tomcat application"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum129"&gt; 129:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;stop&lt;/span&gt; &lt;span style="color: #ff0000"&gt;url&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.url}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum130"&gt; 130:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;username&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.username}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum131"&gt; 131:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;password&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.password}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum132"&gt; 132:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;path&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/${name}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum133"&gt; 133:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum134"&gt; 134:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum135"&gt; 135:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="list"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;description&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="List Tomcat applications"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum136"&gt; 136:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;list&lt;/span&gt; &lt;span style="color: #ff0000"&gt;url&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.url}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum137"&gt; 137:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;username&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.username}"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum138"&gt; 138:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;password&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${tomcat.manager.password}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum139"&gt; 139:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;target&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum140"&gt; 140:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum141"&gt; 141:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- End Tomcat tasks --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum142"&gt; 142:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum143"&gt; 143:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;project&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在整个项目下添加build.properties（这个是给build.xml配置环境变量的。直接拿过来运行的朋友，这里面的内容记得需要修改为&lt;strong&gt;你本地&lt;/strong&gt;的路径哦！！）&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; # Ant properties for building the springapp&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; appserver.home=C:/Program Files/Apache Software Foundation/Tomcat 6.0&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; # for Tomcat 5 use $appserver.home}/server/lib&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; # for Tomcat 6 use $appserver.home}/lib&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; appserver.lib=${appserver.home}/lib&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; deploy.path=${appserver.home}/webapps&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; tomcat.manager.url=http://localhost:8080/manager/html&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; tomcat.manager.username=tomcat&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; tomcat.manager.password=s3cret&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后添加一个controller，在src下添加一个java文件，输入package为：net.spring.controller。这个controller的意思我想懂得mvc的人懂的。&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;package&lt;/span&gt; net.spring.controller;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; org.springframework.stereotype.Controller;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; org.springframework.web.bind.annotation.RequestMapping;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;import&lt;/span&gt; org.springframework.web.servlet.ModelAndView;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; @Controller&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; HelloWorldController {&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; @RequestMapping(&lt;span style="color: #006080"&gt;"/hello"&lt;/span&gt;)&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ModelAndView helloWorld() {&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; String message = &lt;span style="color: #006080"&gt;"Hello World, Spring 3.1.1 Release!"&lt;/span&gt;;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; System.out.println(message);&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ModelAndView(&lt;span style="color: #006080"&gt;"hello"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"message"&lt;/span&gt;, message);&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;接着工作在war目录下。首先加个index.jsp&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&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;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Example :: Spring Application&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Example - Spring Application&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;This is my test.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;a&lt;/span&gt; &lt;span style="color: #ff0000"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="hello.html"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Say Hello&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后加个目录WEB-INF。里面加一个文件web.xml（这个文件很重要，是web项目最重要的配置文件）(有关&lt;a href="http://blog.csdn.net/zhulinu/article/details/7324418" target="_blank"&gt;Servlet&lt;/a&gt;，这个是java web的核心概念。)&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&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;="1.0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="UTF-8"&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&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;web-app&lt;/span&gt; &lt;span style="color: #ff0000"&gt;version&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="2.4"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://java.sun.com/xml/ns/j2ee"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://java.sun.com/xml/ns/j2ee &lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" &lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;display-name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Spring3MVC&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;display-name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;springapp&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-class&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;org.springframework.web.servlet.DispatcherServlet&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-class&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;load-on-startup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;load-on-startup&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-mapping&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;springapp&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;url-pattern&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;*.html&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;url-pattern&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;servlet-mapping&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum20"&gt; 20:&lt;/span&gt; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum21"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;welcome-file-list&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum22"&gt; 22:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum23"&gt; 23:&lt;/span&gt; index.jsp&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum24"&gt; 24:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;welcome-file&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum25"&gt; 25:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;welcome-file-list&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum26"&gt; 26:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum27"&gt; 27:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;web-app&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;加一个文件srpingapp-servlet.xml&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&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;="1.0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="UTF-8"&lt;/span&gt;?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;beans&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.springframework.org/schema/beans"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns:p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.springframework.org/schema/p"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns:context&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.springframework.org/schema/context"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://www.springframework.org/schema/beans&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; http://www.springframework.org/schema/context&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; http://www.springframework.org/schema/context/spring-context-3.0.xsd"&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;context:component-scan&lt;/span&gt; &lt;span style="color: #ff0000"&gt;base-package&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="net.spring.controller"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- the application context definition for the springapp DispatcherServlet --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!-- &amp;lt;bean name="/hello.html" class="net.spring.controller.HelloWorldController"/&amp;gt; --&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;bean&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="viewResolver"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum17"&gt; 17:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.springframework.web.servlet.view.UrlBasedViewResolver"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum18"&gt; 18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="viewClass"&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum19"&gt; 19:&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="org.springframework.web.servlet.view.JstlView"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum20"&gt; 20:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="prefix"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="/WEB-INF/jsp/"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum21"&gt; 21:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="suffix"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=".jsp"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum22"&gt; 22:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;bean&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum23"&gt; 23:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;beans&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在WEB-INF加两个目录：jsp和lib。首先复制引用的jar包，例如Spring的jar，然后在lib目录上粘贴，要引用这些jar：&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251448911.png" data-pinit="registered" height="550" width="395" border="0" /&gt;&lt;/p&gt;&lt;p&gt;然后右键选择项目属性，Build path&amp;#8230; Configure build path. Libraries &amp;#8211; &amp;gt; add jars&amp;#8230;把这些lib下面的jar加入引用。&lt;/p&gt;&lt;p&gt;说一下目录结构：通常，src存放Java源文件，classes存放编译后的class文件，lib存放编译和运行用到的所有jar文件，web存放JSP等web文件，dist存放打包后的jar文件，doc存放API文档。&lt;/p&gt;&lt;p&gt;在jsp目录下添加include.jsp:&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ page session="false"%&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt; &lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;添加hello.jsp，注意里面用了Model里面的：message&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; &lt;span style="background-color: #ffff00"&gt;&amp;lt;%@ include file="/WEB-INF/jsp/include.jsp" %&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&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;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Hello :: Spring Application&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Hello - Spring Application&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h1&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Greetings.&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Message: &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;c:out&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="${message}"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ant编译和自动部署到Tomcat&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了让Eclipse用我们的Ant编译和build.xml文件，需要设置一下Eclipse：项目属性，Builders，把java builder去掉勾，然后New&amp;#8230;一个，选择Ant builder&amp;#8230;.，然后选择build.xml，如图：&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML2e22b43" alt="SNAGHTML2e22b43" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251469981.png" data-pinit="registered" height="644" width="581" border="0" /&gt;&lt;/p&gt;&lt;p&gt;确定了以后，点击菜单 project &amp;#8211;&amp;gt; Build all &amp;#8230; 自动Ant编译：&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; Buildfile: C:\Users\GatesBill\workspace\springapp\build.xml&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;usage&lt;/span&gt;:&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; [echo] springapp build &lt;span style="color: #0000ff"&gt;file&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; [echo] ---------------------------------&lt;span style="color: #008000"&gt;--&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; &lt;span style="color: #008000"&gt; [echo] Available targets are:&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt; [echo] build --&amp;gt; Build the application&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; [echo] deploy --&amp;gt; Deploy application &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; directory&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; [echo] deploywar --&amp;gt; Deploy application &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; a WAR &lt;span style="color: #0000ff"&gt;file&lt;/span&gt;&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; [echo] install --&amp;gt; Install application &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Tomcat&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; [echo] reload --&amp;gt; Reload application &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Tomcat&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum12"&gt; 12:&lt;/span&gt; [echo] &lt;span style="color: #0000ff"&gt;start&lt;/span&gt; --&amp;gt; &lt;span style="color: #0000ff"&gt;Start&lt;/span&gt; Tomcat application&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum13"&gt; 13:&lt;/span&gt; [echo] stop --&amp;gt; Stop Tomcat application&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum14"&gt; 14:&lt;/span&gt; [echo] list --&amp;gt; List Tomcat applications&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum15"&gt; 15:&lt;/span&gt; BUILD SUCCESSFUL&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum16"&gt; 16:&lt;/span&gt; Total &lt;span style="color: #0000ff"&gt;time&lt;/span&gt;: 989 milliseconds&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;看了一下源码，果然已经编译好了：&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251476700.png" data-pinit="registered" height="261" width="427" border="0" /&gt;&lt;/p&gt;&lt;p&gt;但是没有自动部署到Tomcat的webapps里面，我们需要运行Ant deploy：在项目属性，Builders，选择刚才我们新建的那个Ant编译，选择edit，然后里面Argument的地方输入deploy，然后Apply，OK。再次编译，就自动部署Tomcat了：&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; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #606060" id="lnum1"&gt; 1:&lt;/span&gt; Buildfile: C:\Users\GatesBill\workspace\springapp\build.xml&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum2"&gt; 2:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum3"&gt; 3:&lt;/span&gt; build:&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum4"&gt; 4:&lt;/span&gt; [javac] Compiling 1 source &lt;span style="color: #0000ff"&gt;file&lt;/span&gt; &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; C:\Users\GatesBill\workspace\springapp\war\WEB-INF\classes&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum5"&gt; 5:&lt;/span&gt; [javac] warning: [options] bootstrap &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #0000ff"&gt;path&lt;/span&gt; &lt;span style="color: #0000ff"&gt;not&lt;/span&gt; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt; &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; conjunction &lt;span style="color: #0000ff"&gt;with&lt;/span&gt; -source 1.5&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum6"&gt; 6:&lt;/span&gt; [javac] 1 warning&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum7"&gt; 7:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum8"&gt; 8:&lt;/span&gt; deploy:&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum9"&gt; 9:&lt;/span&gt; [copy] Copying 11 files &lt;span style="color: #0000ff"&gt;to&lt;/span&gt; C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\springapp&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum10"&gt; 10:&lt;/span&gt; BUILD SUCCESSFUL&lt;!--CRLF--&gt;&lt;span style="color: #606060" id="lnum11"&gt; 11:&lt;/span&gt; Total &lt;span style="color: #0000ff"&gt;time&lt;/span&gt;: 4 seconds&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;也可以用命令行的方式执行Ant编译（这样我们可以另外写一个deploy的bat脚本，非常方便），不过要首先到computer &amp;#8211; properties &amp;#8211; advanced - 环境变量，添加下列环境变量：&lt;/p&gt;&lt;p&gt;ANT_HOME=＜Ant解压目录，通常在Eclipse的plugin目录下＞，Path=&amp;#8230;;%ANT_HOME%\bin&lt;/p&gt;&lt;p&gt;然后打开command（如果在win7下，可能需要提升administration 权限），转到springapp目录为当前目录，然后执行ant deploy 即可，如下图：&lt;/p&gt;&lt;p&gt;&lt;img data-pinit="registered" style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML3b360e" alt="SNAGHTML3b360e" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204151058126076.png" height="463" width="513" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;到Tomcat的目录下webapps一看，果然有了springapp，然后在浏览器打开Tomcat的manager：&lt;a title="http://localhost:8080/manager/html" href="http://localhost:8080/manager/html"&gt;http://localhost:8080/manager/html&lt;/a&gt;，点击我们的网站springapp，有了：&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML2ea4317" alt="SNAGHTML2ea4317" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251486242.png" data-pinit="registered" height="286" width="655" border="0" /&gt;&lt;/p&gt;&lt;p&gt;点击say hello，链接到：&lt;a title="http://localhost:8080/springapp/hello.html" href="http://localhost:8080/springapp/hello.html"&gt;http://localhost:8080/springapp/hello.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML2eb6ed7" alt="SNAGHTML2eb6ed7" src="http://images.cnblogs.com/cnblogs_com/Mainz/201204/201204142251495294.png" data-pinit="registered" height="286" width="655" border="0" /&gt;&lt;/p&gt;&lt;p&gt;上面这个message是从controller传给model的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Build Error: taskdef class org.apache.catalina.ant.InstallTask cannot be found&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果得到这个错误，一般是因为安装的Tomcat 7而不是Tomcat 6.0，因为在Tomcat 7.0下面要修改下build.xml：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;taskdef&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="install"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;classname&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="org.apache.catalina.ant.InstallTask"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;classpath&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;refid&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;要改成：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;taskdef&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="install"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;classname&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="org.apache.catalina.ant.DeployTask"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;classpath&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;refid&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="catalina-ant-classpath"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;taskdef&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用Ant编译和部署到Tomcat还是非常爽的，过程很流畅。喜欢这种感觉。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2447786.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/04/14/2447786.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/04/13/2446419.html</id><title type="text">Java反编译Jar包和Android APK（类似.NET Reflector）</title><summary type="text">JD-GUI 这个JD-GUI可以反编译jar包，用法就是打开jar包直接浏览。 JD-Eclipse JD-Eclipse是个Eclipse插件，安装方法是打开Eclipse，菜单 ...</summary><published>2012-04-13T14:12:00Z</published><updated>2012-04-13T14:12: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/04/13/2446419.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/04/13/2446419.html"/><content type="html">&lt;p&gt;&lt;strong&gt;JD-GUI&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;这个&lt;a href="http://java.decompiler.free.fr/?q=jdgui" target="_blank"&gt;JD-GUI&lt;/a&gt;可以反编译jar包，用法就是打开jar包直接浏览。&lt;/p&gt;  &lt;p&gt;&lt;img data-pinit="registered" src="http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JD-Eclipse&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://java.decompiler.free.fr/?q=jdeclipse" target="_blank"&gt;JD-Eclipse&lt;/a&gt;是个Eclipse插件，安装方法是打开Eclipse，菜单 Help &amp;#8211; &amp;gt; Install new software&amp;#8230; 输入 &lt;a href="http://java.decompiler.free.fr/jd-eclipse/update"&gt;&lt;strong&gt;http://java.decompiler.free.fr/jd-eclipse/update&lt;/strong&gt;&lt;/a&gt;，然后一路安装即可。然后行会乱掉，需要安装另外一个插件：&lt;a href="http://sourceforge.net/projects/realignmentjd/" target="_blank"&gt;Realignment for JD-Eclipse&lt;/a&gt;, 下载了以后复制到Eclipse的plugin目录下，重启。然后配置默认打开方式：Eclipse，菜单 Window &amp;#8211; &amp;gt; Preference &amp;#8211; General &amp;#8211; Editors &amp;#8211; File Association &amp;#8211; *.class，设置Realignment for JD Class File Editor为Default。保存即可。&lt;/p&gt;  &lt;p&gt;在Eclipse新建一个项目，新加一个目录叫lib，然后从机器上拷贝所有需要反编译的jar包，点那个目录右键：粘贴。设置项目的compile path把那些jar加到libraries里面，这样就可以打开每个jar包了。还能跳转。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;JAD Command&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;首先下载&lt;a href="http://www.varaneckas.com/jad" target="_blank"&gt;Jad.exe&lt;/a&gt;，这个是个批处理命令行工具，没有界面的，而且只能处理.class文件。你可以把所有的jar包用winrar或者7z先解压到一个目录叫classes，然后写个bat批处理文件内容如下：&lt;/p&gt;  &lt;p&gt;jad.exe -r -ff -d src -s java classes/**/*.class&lt;/p&gt;  &lt;p&gt;这样就会反编译为*.java文件了。当然，坏处就是目录没了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;如果是对大量的jar包(假设在jars目录下面)进行批量处理可以这样：&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. 全选jars目录下面所有jar包，然后右键选择7z解压：解压到*\&lt;br /&gt;2. 这样就可以把所有jar包解压到以jar包文件同名的目录里面&lt;br /&gt;3. 然后在系统环境变量注册path：把当前jad路径注册进去&lt;br /&gt;4. 然后cmd运行脚本：jad -r -sjava jars/**/*.class&lt;br /&gt;&amp;nbsp;&amp;nbsp; 运行之前chdir /d 到 jars目录平级目录&lt;br /&gt;5. 这样就可以全部批量反编译为*.java并原有目录结构不会破坏。&lt;br /&gt;6. 这样可以在Notepad++里面可以用文件查找对文件进行搜索&lt;/p&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Android APK的反编译&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;第一步是把apk重命名为zip并解压，然后用&lt;a href="http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip" target="_blank"&gt;dex2jar&lt;/a&gt;处理其中的classes.dex。方法是将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录，运行dex2jar.bat&amp;nbsp;&amp;nbsp;&amp;nbsp; classes.dex，生成classes.dex.dex2jar.jar，运行&lt;a href="http://java.decompiler.free.fr/?q=jdgui" target="_blank"&gt;JD-GUI&lt;/a&gt;（jd-gui.exe），打开上面生成的jar包，即可看到源代码了。如果要处理里面的资源文件、配置文件、图片等，可以用&lt;a href="http://code.google.com/p/android-apktool/downloads/list" target="_blank"&gt;apktool&lt;/a&gt;这个工具。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;反编译以后的编译&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;即使你得到了所有的*.java文件，可能还是不能正常编译，因为不清楚各个项目之间的依赖关系，而且还有资源文件、配置文件等。总之，越大的项目，越混淆的项目，越难搞定。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2446419.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/04/13/2446419.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/03/21/2410699.html</id><title type="text">使用Task.Wait和Cancel解决Remoting超时Timeout问题</title><summary type="text">在Remoting客户端用TcpChannel链接服务端的时候，如果地址不存在会尝试连接到超时Timeout大概21秒左右，例如连接到"tcp://192.192.192.192:8080/Serve...</summary><published>2012-03-21T14:03:00Z</published><updated>2012-03-21T14:03: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/03/21/2410699.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/03/21/2410699.html"/><content type="html">&lt;p&gt;在&lt;a href="http://msdn.microsoft.com/en-us/library/kwdt6w2k%28v=vs.71%29.aspx" target="_blank"&gt;Remoting&lt;/a&gt;客户端用&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.tcp.tcpchannel.aspx" target="_blank"&gt;TcpChannel&lt;/a&gt;链接服务端的时候，如果地址不存在会尝试连接到超时Timeout大概21秒左右，例如连接到"tcp://&lt;strong&gt;192.192.192.192&lt;/strong&gt;:8080/ServerObject"这个不存在的Remoting service地址。如何才能缩短这个&lt;a href="http://msdn.microsoft.com/en-us/library/kwdt6w2k%28v=vs.71%29.aspx" target="_blank"&gt;Remoting&lt;/a&gt;超时Timeout的时间呢？根据&lt;a href="http://msdn.microsoft.com/en-us/library/bb397847.aspx" target="_blank"&gt;MSDN Channel Properties&lt;/a&gt;说明：&lt;a href="http://msdn.microsoft.com/en-us/library/bb397839.aspx" target="_blank"&gt;默认的timeout设置&lt;/a&gt;是infinite（无限），默认失败尝试次数/retryCount是一次。所以很自然，设置&lt;a href="http://msdn.microsoft.com/en-us/library/kwdt6w2k%28v=vs.71%29.aspx" target="_blank"&gt;Remoting&lt;/a&gt;客户端用&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.tcp.tcpchannel.aspx" target="_blank"&gt;TcpChannel&lt;/a&gt;链接服务端的连接超时timeout在timeout参数里面，代码是这样的：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203212202497382.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-21-2012 9-32-56 PM" alt="3-21-2012 9-32-56 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203212202506444.png" height="386" width="684" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;接下来的代码就是调用instance的方法（IMyServiceContract里面定义的）。&lt;/p&gt;  &lt;p&gt;可是测试发现设置的timeout参数没起作用，超时还是21秒。&lt;/p&gt;  &lt;p&gt;后来网上搜了一下，的确这是个普遍的问题，看看&lt;a href="http://social.msdn.microsoft.com/Forums/da-DK/netfxremoting/thread/22d06986-b0a3-42f8-a5bd-43e950302fdf" target="_blank"&gt;这个&lt;/a&gt;和&lt;a href="http://www.cnblogs.com/onlytiancai/articles/1019013.html" target="_blank"&gt;这个&lt;/a&gt;帖子，但可惜都没有解决我的问题。网上都没有好的办法，无奈我只好自己搞定了。用.NET 4.0 TPL里面的&lt;a href="http://msdn.microsoft.com/en-us/library/dd235606.aspx" target="_blank"&gt;Task.Wait(timeSpan)&lt;/a&gt;和cancel搞定。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使用Task.Wait和Cancel解决Remoting超时Timeout问题&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;先看看下面的代码：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203212202514219.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-21-2012 9-38-09 PM" alt="3-21-2012 9-38-09 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203212202512757.png" height="560" width="668" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我想你一定看懂了，意思就是，线程池启动一个线程，做一些事情（这里假设耗时4秒），但必须在超时时间timeout时间内（这里是3秒）内完成，timeout时间到了就取消该线程任务，并返回false。如果操作在3秒内完成了，那么久返回true。很简单吧。&lt;/p&gt;  &lt;p&gt;（&lt;strong&gt;注&lt;/strong&gt;：这里用了&lt;a href="http://msdn.microsoft.com/en-us/library/dd321703.aspx" target="_blank"&gt;CancelationTokenSource.Cancel&lt;/a&gt;()来取消线程任务，并且结合TPL里面的&lt;a href="http://msdn.microsoft.com/en-us/library/dd235606.aspx" target="_blank"&gt;Task.Wait(timeSpan)&lt;/a&gt;，这样实现timeout时间到了就取消该线程任务。请参考MSDN：&lt;a href="http://msdn.microsoft.com/en-us/library/dd997396.aspx" target="_blank"&gt;Task Cancelation&lt;/a&gt; 和&lt;a href="http://msdn.microsoft.com/en-us/library/dd537607.aspx"&gt;How to: Cancel a Task and Its Children&lt;/a&gt;. 细节：如果仅仅调用bool Wait(TimeSpan timeout)，时间到了并不会停止任务执行，而是等待任务执行完成，看所用时间如果超过timespan就返回false，否则返回true。）&lt;/p&gt;  &lt;p&gt;这个方法就是用来测试一个远程地址是否可用，比如连接到"tcp://&lt;strong&gt;192.192.192.192&lt;/strong&gt;:8080/ServerObject"这个不存在的Remoting service地址，如果能在timeout时间内（例如3秒内）返回，那么测试成功。超过就是失败的服务端地址。可以在上面do some task的地方放置你的耗时操作，例如 Activator.GetObject 或者 instance.dosomething() - 一定要用try-catch括起来哦。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;需要注意ChannelServices.UnRegisterChannel&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;有一点需要注意&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.channelservices.unregisterchannel.aspx" target="_blank"&gt;ChannelServices.UnregisterChannel&lt;/a&gt;，如果放在try-catch的那个block里面的话可能不工作，没有效果，看下面的代码：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203212202515756.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-21-2012 9-52-43 PM" alt="3-21-2012 9-52-43 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203212202525657.png" height="278" width="713" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;原因是如果连接到"tcp://&lt;strong&gt;192.192.192.192&lt;/strong&gt;:8080/ServerObject"这个不存在的Remoting service地址，可能会在Activator.GetObject 或者 instance.dosomething()这一步出现connection failed的异常，提示远程remoting服务器连接不上，然后就走到catch里面调用了&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.channelservices.unregisterchannel.aspx" target="_blank"&gt;ChannelServices.UnregisterChannel&lt;/a&gt;了吗？没有，还有retryCount，失败重试，所以实际并没有执行注销channel。&lt;/p&gt;  &lt;p&gt;正确的解决方法是在其他地方，或者过一会儿再调用&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.channelservices.unregisterchannel.aspx" target="_blank"&gt;ChannelServices.UnregisterChannel&lt;/a&gt;。或者在我上述的函数测试一个远程地址是否可用TestRemotingServerAddress调用完成以后，如果是false，就调&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.channelservices.unregisterchannel.aspx" target="_blank"&gt;ChannelServices.UnregisterChannel&lt;/a&gt;。此外，如果endpoint地址改变了，需要调用&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.channelservices.unregisterchannel.aspx" target="_blank"&gt;ChannelServices.UnregisterChannel&lt;/a&gt;，否则会发生异常。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2410699.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/21/2410699.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/03/20/2408859.html</id><title type="text">ASP.NET调用多Endpoint多Contract的WCF Service</title><summary type="text">本文主要讲述ASP.NET调用多Endpoint多Contract的WCF Service，包括以下实现： ASP.NET调用WCF Service WCF Service Libra...</summary><published>2012-03-20T13:48:00Z</published><updated>2012-03-20T13:48: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/03/20/2408859.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/03/20/2408859.html"/><content type="html">&lt;p&gt;本文主要讲述ASP.NET调用多Endpoint多Contract的WCF Service，包括以下实现：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ASP.NET调用WCF Service &lt;/li&gt;    &lt;li&gt;WCF Service Library，在IIS Host &lt;/li&gt;    &lt;li&gt;多Endpoint多Contract的WCF Service（在一个服务*.svc实现） &lt;/li&gt;    &lt;li&gt;动态引用WCF 服务 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;本文的全部源码可以在&lt;a href="http://files.cnblogs.com/Mainz/demowcf.7z" target="_blank"&gt;这儿&lt;/a&gt;下载（&lt;a href="http://files.cnblogs.com/Mainz/demowcf.7z" target="_blank"&gt;ASP.NET调用多Endpoint多Contract的WCF Service源码&lt;/a&gt;）。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;代码结构&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;代码结构如下：三个工程，一个是WCF Service（IIS Host）包含一个空的*.svc，一个是WCF Service Library，一个是ASP.NET客户端调用WCF Service。使用WCF Service Library的好处当然是灵活性，你可以自己选择用什么方式Host WCF Service，可以是IIS/WebService，也可以是Windows Service，或者自定义的应用等。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148147995.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-03-19 PM" alt="3-20-2012 9-03-19 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148154864.png" border="0" height="560" width="320" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;在一个*.svc实现多个Contract和Endpoint，示意图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148158943.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-40-25 PM" alt="3-20-2012 9-40-25 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148169433.png" border="0" height="264" width="594" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;先讲一下WCF Service Library，里面就是放了些Service Contract，还有实现；你当然可以在Contract抽出来放在另外一个dll一面，这里为了演示方便，放在了一起。但为了一个*.svc实现多个Contract和Endpoint，要注意这个service必须实现多个contract接口，这里用局部类来实现：partial class&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148166925.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-23-02 PM" alt="3-20-2012 9-23-02 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148162780.png" border="0" height="207" width="432" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;IService2是这样的：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148174350.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-20-16 PM" alt="3-20-2012 9-20-16 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148173794.png" border="0" height="249" width="317" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;WCF SERVICE的Web.config配置：(一个*.svc实现多个Contract和Endpoint)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148188645.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-06-39 PM" alt="3-20-2012 9-06-39 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148195515.png" border="0" height="602" width="732" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WCF Service的Service1.svc就是一个空壳，但要修改一下，把实现指向WCf Service Library:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148207368.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-08-26 PM" alt="3-20-2012 9-08-26 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148204859.png" border="0" height="171" width="700" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WCF Service运行起来以后是可以访问的：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148225741.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-30-57 PM" alt="3-20-2012 9-30-57 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148259314.png" border="0" height="431" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;在ASP.NET客户端调用WCF Service：（可以分别调用多个Service Contract接口）&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148252346.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-05-09 PM" alt="3-20-2012 9-05-09 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148268343.png" border="0" height="375" width="610" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;注意，这里是直接静态服务引用，可以实现动态创建WCF服务引用，这里不复代码了，很简单的。&lt;/p&gt;  &lt;p&gt;在ASP.NET客户端Web.config:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148276608.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-20-2012 9-38-06 PM" alt="3-20-2012 9-38-06 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203202148276052.png" border="0" height="292" width="630" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;源码下载&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;本文的全部源码可以在&lt;a href="http://files.cnblogs.com/Mainz/demowcf.7z" target="_blank"&gt;这儿&lt;/a&gt;下载（&lt;a href="http://files.cnblogs.com/Mainz/demowcf.7z" target="_blank"&gt;ASP.NET调用多Endpoint多Contract的WCF Service源码&lt;/a&gt;）。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2408859.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/20/2408859.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/03/12/2391481.html</id><title type="text">SQLServer2008 R2如何允许远程连接(Named instance)</title><summary type="text">1. 安装的时候选择mixed混合认证模式（windows认证和sa等用户登录） 2. SQLServer管理器打开，右键你的数据库实例，在Connections，右边保证勾上 Allow remote connections to this server.3. Windows - start - all programs - Microsoft SQL Server 2008 R2 - Configuration Tools - Microsoft Configuration Manager SQL Server Network Configuration - Protocols for .</summary><published>2012-03-12T03:20:00Z</published><updated>2012-03-12T03:20: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/03/12/2391481.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/03/12/2391481.html"/><content type="html">1. 安装的时候选择mixed混合认证模式（windows认证和sa等用户登录）&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;2. SQLServer管理器打开，右键你的数据库实例，在Connections，右边保证勾上 Allow remote connections to this server.&lt;br /&gt;3. Windows - start - all programs - Microsoft SQL Server 2008 R2 - Configuration Tools - Microsoft Configuration Manager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL Server Network Configuration - Protocols for MSSQLSERVER&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 右边TCP/IP, 双击设置为Enabled，如果不放心，第二个选项卡IP address里面所有enabled为No的设置为YES&lt;br /&gt;4. 如果机器上就一个SQLServer实例，那么就是通过TCP 1433端口远程连接。如果你打开了防火墙，需要放开1433端口，设置方法在这儿：&lt;a href="http://technet.microsoft.com/en-us/library/ms175043.aspx"&gt;http://technet.microsoft.com/en-us/library/ms175043.aspx&lt;/a&gt;&lt;br /&gt;5.&amp;nbsp; 如果机器上有多个数据库，例如 SQLServer2005, SQLServer2008, SQLServer2008R2等，而你的SQLServer2008R2安装在Named instance，例如localhost\MyInstance&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那么就不在1433端口，默认是UDP 1434端口（你还可以自己指定，在第三点的第二个选项卡IP address里面IPALL里面输入SQL运行的端口），这时需要打开SQL Browser service服务。在服务 - SQL Browser service，设置为自动启动。&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 如果你打开了防火墙，需要放开UDP 1434端口，防火墙加上特例SQL Browser service即可，即 &amp;#8221; C:\Program Files\Microsoft SQL Server\90\Shared\sqlbrowser.exe&amp;#8221;&lt;br /&gt;6. 重启SQLServer服务&lt;br /&gt;7. 本地 netstat -ano|findstr 143 确保端口已在侦听&lt;br /&gt;8. 远程可以尝试连接，如果不行，可以用telnet &amp;lt; servername &amp;gt;&amp;lt;TCP_Port&amp;gt;测试。&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2391481.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/12/2391481.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Mainz/archive/2012/03/06/2382653.html</id><title type="text">基于ASP.NET MVC3 Razor的模块化/插件式架构实现</title><summary type="text">本文主要探讨了一种基于ASP.NET MVC3 Razor的模块化（Plugin）/插件（plugin）式架构的实现方法。本文借鉴了《Compile your asp.net mvc Razor vi...</summary><published>2012-03-06T13:36:00Z</published><updated>2012-03-06T13: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/2012/03/06/2382653.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Mainz/archive/2012/03/06/2382653.html"/><content type="html">&lt;p&gt;本文主要探讨了一种&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/06/2382653.html" target="_blank"&gt;基于ASP.NET MVC3 Razor的模块化（Plugin）/插件（plugin）式架构的实现&lt;/a&gt;方法。本文借鉴了《&lt;a href="http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/" target="_blank"&gt;Compile your asp.net mvc Razor views into a seperate dll&lt;/a&gt;》作者提供的方法。敬请注意。其实ASP.NET MVC的模块化（Plugin）/插件（plugin）式架构讨论的很多，但基于&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;Razor&lt;/a&gt;视图引擎的很少（如：&lt;a href="http://fzysqr.com/2010/09/10/asp-net-mvc2-plugin-architecture-tutorial-part-3/" target="_blank"&gt;MVC2插件架构&lt;/a&gt;&lt;a href="http://fzysqr.com/2010/09/10/asp-net-mvc2-plugin-architecture-tutorial-part-3/" target="_blank"&gt;例子&lt;/a&gt;都是基于WebForm的，&lt;a href="http://mvccontrib.codeplex.com/"&gt;MVCContrib&lt;/a&gt; &lt;a href="http://mvccontrib.codeplex.com/wikipage?title=Creating%20a%20Portable%20Area&amp;amp;referringTitle=Documentation"&gt;Portable Areas&lt;/a&gt;也是，还有&lt;a href="http://www.wynia.org/wordpress/2008/12/aspnet-mvc-plugins/" target="_blank"&gt;这个Plugin架构&lt;/a&gt;）。要么就是非常复杂非常重量级的框架，例如&lt;a href="http://orchard.codeplex.com/" target="_blank"&gt;Orchard CMS&lt;/a&gt;的模块化做的很好，可惜太重量级了，也没独立的模块可以剥离出来。所以我们追寻的是简单的&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/06/2382653.html" target="_blank"&gt;基于ASP.NET MVC3 Razor的模块化（Plugin）/插件（plugin）式架构的实现&lt;/a&gt;方法。本文最后实现的项目结构如下图：（插件都放到~/Plugin目录下，按功能划分模块，每个模块都有M,V,C）&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136094280.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-5-2012 5-07-19 PM" alt="3-5-2012 5-07-19 PM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136102786.png" border="0" height="692" width="344" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其中，业务模块（class library project）包含其所有的视图、控制器等，模型可以放在里面也可以单独放一个project。主web项目没有引用业务模块，业务模块会编译到主web项目的~/plugin目录下面（注意：不是bin目录），然后当web应用启动的时候自动加载plugin目录下面的模块。最后运行起来的效果如下图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136112686.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="3-6-2012 10-28-51 AM" alt="3-6-2012 10-28-51 AM" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136121126.png" border="0" height="430" width="623" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其中红色的区域都是plugin进去的，那个tab的标题plugin到母版页的主菜单，tab内容也来自plugin。下面说说&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/06/2382653.html" target="_blank"&gt;如何实现这样的ASP.NET MVC插件式plugin架构（模块化架构）。&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;实现的难点在动态加载UI视图（*.cshtml, _layout.cshtml, _viewStart.cshtml)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;废话少说，直入要害。基于ASP.NET MVC3 Razor的编译发生在两个层面：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;控制器（Controller）, 模型（Models），和其它所有的C#代码等有msbuild（或者VisualStudio）编译到bin目录下的程序集（assembly） &lt;/li&gt;    &lt;li&gt;视图（*.aspx, *.cshtml）由ASP.NET在运行时动态编译。当一个&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;Razor&lt;/a&gt;视图（*.cshtml）显示前，&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;Razor&lt;/a&gt;视图引擎调用&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.compilation.buildmanager.aspx" target="_blank"&gt;BuildManager&lt;/a&gt;把视图(*.cshtml)编译到动态程序集assembly，然后使用&lt;em&gt;Activator.CreateInstance&lt;/em&gt;来实例化新编译出来的对象，最后显示出来。如果视图(*.cshtml)用到@model绑定model，那么还会自动加载bin或者GAC里面的Model。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;所以如果我们要动态加载插件（plugin），用反射bin目录下的程序集（assembly）的方法很容易搞定上面的第一部分（C#代码的部分），但UI视图的部分（上面第二部分）（特别是*.cshtml, 母版_layout.cshtml, 基视图_viewStart.cshtml）就比较难搞定。而且每次报错都是一样的，那就是Controller找不到相应的视图View，基本不知所云而且根本不是要点：&lt;em&gt;view&lt;/em&gt; &amp;#8230;. &lt;em&gt;or its master was not found or no view engine supports the searched locations. The following locations were searched: &amp;#8230;&lt;/em&gt;，因此要搞定UI视图的部分（上面第二部分）（特别是*.cshtml, 母版_layout.cshtml, 基视图_viewStart.cshtml），就需要自己动手了，基本原理是：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;重载&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.webpages.razor.razorbuildprovider%28v=vs.99%29.aspx" target="_blank"&gt;RazorBuildProvider&lt;/a&gt;，用来动态编译视图 &lt;/li&gt;    &lt;li&gt;实现一个自定义&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider.aspx" target="_blank"&gt;VirtualPathProvider&lt;/a&gt;，从虚拟路径自定义判断读取资源（从插件中加载资源），如果要使用编译的视图就返回编译的&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.hosting.virtualfile.aspx" target="_blank"&gt;VirtualFile&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;实现一个容器Dictionary保存已编译的视图和虚拟路径，例如path &amp;lt;~/views/team/index.cshtml&amp;gt; type &amp;lt;Area.Module2.Views.Team._Page_Views_Team_Index_cshtml&amp;gt;，或者path &amp;lt;~/views/_viewstart.cshtml&amp;gt; type &amp;lt;Area.Module1.Views._Page_Views__ViewStart_cshtml&amp;gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;代码：自定义&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider.aspx" target="_blank"&gt;VirtualPathProvider&lt;/a&gt;，从虚拟路径自定义判断读取资源（从插件中加载资源），如果要使用编译的视图就返回编译的&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.hosting.virtualfile.aspx" target="_blank"&gt;VirtualFile&lt;/a&gt; &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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Reflection;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Caching;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Hosting;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.WebPages;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; CompiledVirtualPathProvider: VirtualPathProvider&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// Gets a value that indicates whether a file exists in the virtual file system.&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// true if the file exists in the virtual file system; otherwise, false.&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="virtualPath"&amp;gt;The path to the virtual file.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; FileExists(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; virtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;                 GetCompiledType(virtualPath) != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;                 || Previous.FileExists(virtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; Type GetCompiledType(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; virtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ApplicationPartRegistry.Instance.GetCompiledType(virtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// Gets a virtual file from the virtual file system.&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// A descendent of the &amp;lt;see cref="T:System.Web.Hosting.VirtualFile"/&amp;gt; class that represents a file in the virtual file system.&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="virtualPath"&amp;gt;The path to the virtual file.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; VirtualFile GetFile(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; virtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (Previous.FileExists(virtualPath))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Previous.GetFile(virtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;             var compiledType = GetCompiledType(virtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (compiledType != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CompiledVirtualFile(virtualPath, compiledType);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; System.Web.Caching.CacheDependency GetCacheDependency(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (virtualPathDependencies == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Previous.GetCacheDependency(virtualPath, &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;                     from vp &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; virtualPathDependencies.Cast&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;()&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;                     &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; GetCompiledType(vp) == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;                     select vp&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;                   , utcStart);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;代码：容器Dictionary保存已编译的视图和虚拟路径，例如path &amp;lt;~/views/team/index.cshtml&amp;gt; type &amp;lt;Area.Module2.Views.Team._Page_Views_Team_Index_cshtml&amp;gt;，路径注册以后，会从容器库全局搜索所有注册过的视图，也就是说即使你视图引用的_layout.cshtml和_viewStart.cshtml在其他的Class library project照样可以找到。&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Diagnostics;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Reflection;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.WebPages;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DictionaryBasedApplicationPartRegistry : IApplicationPartRegistry&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; Type webPageType = &lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(WebPageRenderingBase); &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, Type&amp;gt; registeredPaths = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, Type&amp;gt;();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;param name="virtualPath"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt; Type GetCompiledType(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; virtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (virtualPath == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #006080"&gt;"virtualPath"&lt;/span&gt;);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Debug.WriteLine(String.Format("---GetCompiledType : virtualPath &amp;lt;{0}&amp;gt;", virtualPath));&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (virtualPath.StartsWith(&lt;span style="color: #006080"&gt;"/"&lt;/span&gt;))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;                 virtualPath = VirtualPathUtility.ToAppRelative(virtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!virtualPath.StartsWith(&lt;span style="color: #006080"&gt;"~"&lt;/span&gt;))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;                 virtualPath = !virtualPath.StartsWith(&lt;span style="color: #006080"&gt;"/"&lt;/span&gt;) ? &lt;span style="color: #006080"&gt;"~/"&lt;/span&gt; + virtualPath : &lt;span style="color: #006080"&gt;"~"&lt;/span&gt; + virtualPath;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;             virtualPath = virtualPath.ToLower();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; registeredPaths.ContainsKey(virtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;                        ? registeredPaths[virtualPath]&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;                        : &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Register(Assembly applicationPart)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;             ((IApplicationPartRegistry)&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).Register(applicationPart, &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Register(Assembly applicationPart, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; rootVirtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Debug.WriteLine(String.Format("---Register assembly &amp;lt;{0}&amp;gt;, path &amp;lt;{1}&amp;gt;", applicationPart.FullName, rootVirtualPath));&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var type &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; applicationPart.GetTypes().Where(type =&amp;gt; type.IsSubclassOf(webPageType)))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//Debug.WriteLine(String.Format("-----Register type &amp;lt;{0}&amp;gt;, path &amp;lt;{1}&amp;gt;", type.FullName, rootVirtualPath));&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;                 ((IApplicationPartRegistry)&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).RegisterWebPage(type, rootVirtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RegisterWebPage(Type type)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;             ((IApplicationPartRegistry)&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;).RegisterWebPage(type, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Empty);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RegisterWebPage(Type type, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; rootVirtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;             var attribute = type.GetCustomAttributes(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(PageVirtualPathAttribute), &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;).Cast&amp;lt;PageVirtualPathAttribute&amp;gt;().SingleOrDefault&amp;lt;PageVirtualPathAttribute&amp;gt;();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (attribute != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt;                 var rootRelativeVirtualPath = GetRootRelativeVirtualPath(rootVirtualPath ?? &lt;span style="color: #006080"&gt;""&lt;/span&gt;, attribute.VirtualPath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//Debug.WriteLine(String.Format("---Register path/type : path &amp;lt;{0}&amp;gt; type &amp;lt;{1}&amp;gt;", rootRelativeVirtualPath.ToLower(),&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum67"&gt;  67:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//                              type.FullName));&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum68"&gt;  68:&lt;/span&gt;                 registeredPaths[rootRelativeVirtualPath.ToLower()] = type;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum69"&gt;  69:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum70"&gt;  70:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum71"&gt;  71:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum72"&gt;  72:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetRootRelativeVirtualPath(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; rootVirtualPath, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; pageVirtualPath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum73"&gt;  73:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum74"&gt;  74:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; relativePath = pageVirtualPath;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum75"&gt;  75:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (relativePath.StartsWith(&lt;span style="color: #006080"&gt;"~/"&lt;/span&gt;, StringComparison.Ordinal))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum76"&gt;  76:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum77"&gt;  77:&lt;/span&gt;                 relativePath = relativePath.Substring(2);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum78"&gt;  78:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum79"&gt;  79:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!rootVirtualPath.EndsWith(&lt;span style="color: #006080"&gt;"/"&lt;/span&gt;, StringComparison.OrdinalIgnoreCase))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum80"&gt;  80:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum81"&gt;  81:&lt;/span&gt;                 rootVirtualPath = rootVirtualPath + &lt;span style="color: #006080"&gt;"/"&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum82"&gt;  82:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum83"&gt;  83:&lt;/span&gt;             relativePath = VirtualPathUtility.Combine(rootVirtualPath, relativePath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum84"&gt;  84:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!relativePath.StartsWith(&lt;span style="color: #006080"&gt;"~"&lt;/span&gt;))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum85"&gt;  85:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum86"&gt;  86:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; !relativePath.StartsWith(&lt;span style="color: #006080"&gt;"/"&lt;/span&gt;) ? &lt;span style="color: #006080"&gt;"~/"&lt;/span&gt; + relativePath : &lt;span style="color: #006080"&gt;"~"&lt;/span&gt; + relativePath;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum87"&gt;  87:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum88"&gt;  88:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; relativePath;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum89"&gt;  89:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum90"&gt;  90:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum91"&gt;  91:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;下面的代码很关键，用PreApplicationStartMethod关键字(.NET 4.0开始支持）使得代码在Application_Start之前执行。&lt;/p&gt;&lt;p&gt;有关[&lt;strong&gt;assembly: PreApplicationStartMethod&lt;/strong&gt;(typeof(SomeClassLib.Initializer), "Initialize")]详细信息请参考&lt;a href="http://www.paraesthesia.com/archive/2011/02/08/dynamic-httpmodule-registration-in-asp-net-4-0.aspx" target="_blank"&gt;这个页面&lt;/a&gt;和&lt;a href="http://haacked.com/archive/2010/05/16/three-hidden-extensibility-gems-in-asp-net-4.aspx" target="_blank"&gt;这个页面&lt;/a&gt;。&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Compilation;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Hosting;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Common.Framework;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Common.PrecompiledViews;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; [assembly: PreApplicationStartMethod(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(PreApplicationStartCode), &lt;span style="color: #006080"&gt;"Start"&lt;/span&gt;)]&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; PreApplicationStartCode&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; _startWasCalled;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Start()&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_startWasCalled)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;             _startWasCalled = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Register virtual paths&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;             HostingEnvironment.RegisterVirtualPathProvider(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; CompiledVirtualPathProvider());&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Load Plugin Folder, &lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;             PluginLoader.Initialize();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;代码：PluginLoader，加载plugin目录里面的东东（assembly和module配置文件）&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Reflection;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Threading;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Compilation;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Hosting;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Common.Framework;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; Common.PrecompiledViews;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; &lt;span style="color: #008000"&gt;//[assembly: PreApplicationStartMethod(typeof(PluginLoader), "Initialize")]&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.PrecompiledViews&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; PluginLoader&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Initialize(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; folder = &lt;span style="color: #006080"&gt;"~/Plugin"&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;             LoadAssemblies(folder);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             LoadConfig(folder);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; LoadConfig(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; folder, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; defaultConfigName=&lt;span style="color: #006080"&gt;"*.config"&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;             var directory = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DirectoryInfo(HostingEnvironment.MapPath(folder));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             var configFiles = directory.GetFiles(defaultConfigName, SearchOption.AllDirectories).ToList();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (configFiles.Count == 0) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var configFile &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; configFiles.OrderBy(s =&amp;gt; s.Name))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;                 ModuleConfigContainer.Register(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ModuleConfiguration(configFile.FullName));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; LoadAssemblies(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; folder)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;             var directory = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DirectoryInfo(HostingEnvironment.MapPath(folder));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;             var binFiles = directory.GetFiles(&lt;span style="color: #006080"&gt;"*.dll"&lt;/span&gt;, SearchOption.AllDirectories).ToList();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (binFiles.Count == 0) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var plug &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; binFiles)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//running in full trust&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//************&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//if (GetCurrentTrustLevel() != AspNetHostingPermissionLevel.Unrestricted)&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//set in web.config, probing to plugin\temp and copy all to that folder&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//************************&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;                 var shadowCopyPlugFolder = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DirectoryInfo(AppDomain.CurrentDomain.DynamicDirectory);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;                 var shadowCopiedPlug = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FileInfo(Path.Combine(shadowCopyPlugFolder.FullName, plug.Name));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;                 File.Copy(plug.FullName, shadowCopiedPlug.FullName, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;); &lt;span style="color: #008000"&gt;//TODO: Exception handling here...&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt;                 var shadowCopiedAssembly = Assembly.Load(AssemblyName.GetAssemblyName(shadowCopiedPlug.FullName));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//add the reference to the build manager&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;                 BuildManager.AddReferencedAssembly(shadowCopiedAssembly);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//private static AspNetHostingPermissionLevel GetCurrentTrustLevel()&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//{&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//    foreach (AspNetHostingPermissionLevel trustLevel in&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        new AspNetHostingPermissionLevel[]&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//            {&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//                AspNetHostingPermissionLevel.Unrestricted,&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum67"&gt;  67:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//                AspNetHostingPermissionLevel.High,&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum68"&gt;  68:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//                AspNetHostingPermissionLevel.Medium,&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum69"&gt;  69:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//                AspNetHostingPermissionLevel.Low,&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum70"&gt;  70:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//                AspNetHostingPermissionLevel.Minimal&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum71"&gt;  71:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//            })&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum72"&gt;  72:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//    {&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum73"&gt;  73:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        try&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum74"&gt;  74:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        {&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum75"&gt;  75:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//            new AspNetHostingPermission(trustLevel).Demand();&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum76"&gt;  76:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        }&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum77"&gt;  77:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        catch (System.Security.SecurityException)&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum78"&gt;  78:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        {&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum79"&gt;  79:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//            continue;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum80"&gt;  80:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        }&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum81"&gt;  81:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum82"&gt;  82:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//        return trustLevel;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum83"&gt;  83:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//    }&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum84"&gt;  84:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum85"&gt;  85:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//    return AspNetHostingPermissionLevel.None;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum86"&gt;  86:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//}&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum87"&gt;  87:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum88"&gt;  88:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum89"&gt;  89:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;此外，使用&lt;a href="http://razorgenerator.codeplex.com/" target="_blank"&gt;SingleFileGenerator&lt;/a&gt;的优点是性能提升，缺点是修改了视图就要重新编译。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何让ASP.NET加载BIN目录之外的路径的Assembly&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们把各个模块编译出来的assembly和各个模块的配置文件自动放到一个bin平级的plugin目录，然后web应用启动的时候自动扫描这个plugin目录并加载各个模块plugin，这个怎么做到的？大家也许知道，ASP.NET只允许读取Bin目录下的assbmely，不可以读取其他路径，包括Bin\abc等，即使在web.config这样&lt;a href="http://msdn.microsoft.com/en-us/library/823z9h8w.aspx" target="_blank"&gt;配置probing&lt;/a&gt;也不行：（不信你可以试一下）&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;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;configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Element&lt;!--CRLF--&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;runtime&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; Element&lt;!--CRLF--&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;assemblyBinding&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="urn:schemas-microsoft-com:asm.v1"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;probing&lt;/span&gt; &lt;span style="color: #ff0000"&gt;privatePath&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="bin;bin\abc;plugin;"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;assemblyBinding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;runtime&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&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;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个和&lt;a href="http://msdn.microsoft.com/en-us/library/wyts434y.aspx" target="_blank"&gt;TrustLevel&lt;/a&gt;有关，在&lt;a href="http://msdn.microsoft.com/en-us/library/wyts434y.aspx" target="_blank"&gt;Full Trust&lt;/a&gt;的情况下，可以这样读取非Bin目录下的assembly：&lt;/p&gt;&lt;p&gt;首先在和Bib平级的地方建一个目录Plugin，然后在模块class library project的属性里面加一个postBuildEvent，就是说在编译完成以后把模块的assbmely自动拷贝到主web项目的plugin目录：&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)ModularWebApplication\Plugin\"&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; copy /Y "$(TargetDir)$(ProjectName).config" "$(SolutionDir)ModularWebApplication\Plugin\"&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后用下面的代码加载Plugin目录下的assembly：（只看LoadAssembly那一段）&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; using System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; using System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; using System.IO;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; using System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; using System.Reflection;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; using System.Text;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; using System.Threading;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; using System.Web;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; using System.Web.Compilation;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; using System.Web.Hosting;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; using Common.Framework;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt; using Common.PrecompiledViews;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt; //[assembly: PreApplicationStartMethod(typeof(PluginLoader), "Initialize")]&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt; namespace Common.PrecompiledViews&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     public class PluginLoader&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         public static void Initialize(string folder = "~/Plugin")&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;             LoadAssemblies(folder);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             LoadConfig(folder);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;         private static void LoadConfig(string folder, string defaultConfigName="*.config")&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;             var directory = new DirectoryInfo(HostingEnvironment.MapPath(folder));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             var configFiles = directory.GetFiles(defaultConfigName, SearchOption.AllDirectories).ToList();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;             if (configFiles.Count == 0) return;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;             foreach (var configFile in configFiles.OrderBy(s =&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; s.Name))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;                 ModuleConfigContainer.Register(new ModuleConfiguration(configFile.FullName));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;         private static void LoadAssemblies(string folder)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;             var directory = new DirectoryInfo(HostingEnvironment.MapPath(folder));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;             var binFiles = directory.GetFiles("*.dll", SearchOption.AllDirectories).ToList();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;             if (binFiles.Count == 0) return;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;             foreach (var plug in binFiles)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;                 //running in full trust&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;                 //************&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;                 //if (GetCurrentTrustLevel() != AspNetHostingPermissionLevel.Unrestricted)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;                 //set in web.config, probing to plugin\temp and copy all to that folder&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;                 //************************&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;                 var shadowCopyPlugFolder = new DirectoryInfo(AppDomain.CurrentDomain.DynamicDirectory);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;                 var shadowCopiedPlug = new FileInfo(Path.Combine(shadowCopyPlugFolder.FullName, plug.Name));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt;                 File.Copy(plug.FullName, shadowCopiedPlug.FullName, true); //TODO: Exception handling here...&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum54"&gt;  54:&lt;/span&gt;                 var shadowCopiedAssembly = Assembly.Load(AssemblyName.GetAssemblyName(shadowCopiedPlug.FullName));&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum55"&gt;  55:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum56"&gt;  56:&lt;/span&gt;                 //add the reference to the build manager&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum57"&gt;  57:&lt;/span&gt;                 BuildManager.AddReferencedAssembly(shadowCopiedAssembly);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum58"&gt;  58:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum59"&gt;  59:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum60"&gt;  60:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum61"&gt;  61:&lt;/span&gt;         //private static AspNetHostingPermissionLevel GetCurrentTrustLevel()&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum62"&gt;  62:&lt;/span&gt;         //{&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum63"&gt;  63:&lt;/span&gt;         //    foreach (AspNetHostingPermissionLevel trustLevel in&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum64"&gt;  64:&lt;/span&gt;         //        new AspNetHostingPermissionLevel[]&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum65"&gt;  65:&lt;/span&gt;         //            {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum66"&gt;  66:&lt;/span&gt;         //                AspNetHostingPermissionLevel.Unrestricted,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum67"&gt;  67:&lt;/span&gt;         //                AspNetHostingPermissionLevel.High,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum68"&gt;  68:&lt;/span&gt;         //                AspNetHostingPermissionLevel.Medium,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum69"&gt;  69:&lt;/span&gt;         //                AspNetHostingPermissionLevel.Low,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum70"&gt;  70:&lt;/span&gt;         //                AspNetHostingPermissionLevel.Minimal&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum71"&gt;  71:&lt;/span&gt;         //            })&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum72"&gt;  72:&lt;/span&gt;         //    {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum73"&gt;  73:&lt;/span&gt;         //        try&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum74"&gt;  74:&lt;/span&gt;         //        {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum75"&gt;  75:&lt;/span&gt;         //            new AspNetHostingPermission(trustLevel).Demand();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum76"&gt;  76:&lt;/span&gt;         //        }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum77"&gt;  77:&lt;/span&gt;         //        catch (System.Security.SecurityException)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum78"&gt;  78:&lt;/span&gt;         //        {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum79"&gt;  79:&lt;/span&gt;         //            continue;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum80"&gt;  80:&lt;/span&gt;         //        }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum81"&gt;  81:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum82"&gt;  82:&lt;/span&gt;         //        return trustLevel;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum83"&gt;  83:&lt;/span&gt;         //    }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum84"&gt;  84:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum85"&gt;  85:&lt;/span&gt;         //    return AspNetHostingPermissionLevel.None;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum86"&gt;  86:&lt;/span&gt;         //}&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum87"&gt;  87:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum88"&gt;  88:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum89"&gt;  89:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果不是&lt;a href="http://msdn.microsoft.com/en-us/library/wyts434y.aspx" target="_blank"&gt;Full Trust&lt;/a&gt;，例如&lt;a href="http://msdn.microsoft.com/en-us/library/wyts434y.aspx" target="_blank"&gt;Medium Trust&lt;/a&gt;的情况下参考这个帖子《&lt;a href="http://shazwazza.com/post/Developing-a-plugin-framework-in-ASPNET-with-medium-trust.aspx" target="_blank"&gt;Developing-a-plugin-framework-in-ASPNET-with-medium-trust&lt;/a&gt;》。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何在_layout.cshtml的主菜单注入plugin的菜单&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在母版页_layout.cshtml有个主菜单，一般是这样写的：&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;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;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink("Home", "Index", "Home")&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink("About", "About", "Home")&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink("Team", "Index", "Team")&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;现在我们如何实现从模块插入plugin到这个主菜单呢？这个有点难。因为大家知道，_layout.cshml母版没有controller。怎么实现呢？方法是用controller基类，让所有controller继承自这个基类。然后在基类里面，读取plugin目录里面的配置文件，获取所有模块需要插入的主菜单项，然后放入viewBag，这样在_Layout.cshtml就可以获取viewBag，类似这样：&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;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;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;    @foreach (MainMenuItemModel entry in ViewBag.MainMenuItems)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     {&lt;!--CRLF--&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;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;@Html.ActionLink(entry.Text, &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;                entry.ActionName, &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;                 entry.ControllerName)&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;代码：基类Controller，读取plugin目录里面的配置文件，获取所有模块需要插入的主菜单项，然后放入viewBag&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.ComponentModel;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Net.Mime;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; BaseController : Controller&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Initialize(System.Web.Routing.RequestContext requestContext)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.Initialize(requestContext);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// retireve data from plugins&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;             IEnumerable&amp;lt;ModuleConfiguration&amp;gt; ret = ModuleConfigContainer.GetConfig();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;             var data = (from c &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; ret&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;                         from menu &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; c.MainMenuItems&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;                         select &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MainMenuItemModel&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;                                    {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;                                        Id = menu.Id, ActionName = menu.ActionName, ControllerName = menu.ControllerName, Text = menu.Text&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;                                    }).ToList();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;             &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;             ViewBag.MainMenuItems = data.AsEnumerable();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;代码：ModuleConfigContainer，用到单例模式，只读取一次&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ModuleConfigContainer&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ModuleConfigContainer()&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;             Instance = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ModuleConfigDictionary();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IModuleConfigDictionary Instance { get; set; }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Register(ModuleConfiguration item)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;             Instance.Register(item);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;ModuleConfiguration&amp;gt; GetConfig()&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Instance.GetConfigs();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;代码：ModuleConfigDictionary &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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ModuleConfigDictionary : IModuleConfigDictionary&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, ModuleConfiguration&amp;gt;  _configurations = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;, ModuleConfiguration&amp;gt;();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;ModuleConfiguration&amp;gt; GetConfigs()&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _configurations.Values.AsEnumerable();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Register(ModuleConfiguration item)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(_configurations.ContainsKey(item.ModuleName))&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;                 _configurations[item.ModuleName] = item;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;                 _configurations.Add(item.ModuleName, item);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;代码：ModuleConfiguration，读取模块的配置文件&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;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.IO;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Text;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Xml;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Xml.Linq;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; Common.Framework&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ModuleConfiguration&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ModuleConfiguration(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; filePath)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;                 var doc = XDocument.Load(filePath);&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;                 var root = XElement.Parse(doc.ToString());&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!root.HasElements) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;                 var module = from e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; root.Descendants(&lt;span style="color: #006080"&gt;"module"&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;                              &lt;span style="color: #008000"&gt;//where e.Attribute("name").Value == "xxxx"&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;                              select e;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!module.Any()) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;                 ModuleName = module.FirstOrDefault().Attribute(&lt;span style="color: #006080"&gt;"name"&lt;/span&gt;).Value;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;                 var menus = from e &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; module.FirstOrDefault().Descendants(&lt;span style="color: #006080"&gt;"menu"&lt;/span&gt;)&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;                             select e;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!menus.Any()) &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;                 var menuitems = menus.Select(xElement =&amp;gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; MainMenuItemModel&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt;                                                              {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum37"&gt;  37:&lt;/span&gt;                                                                  Id = xElement.Attribute(&lt;span style="color: #006080"&gt;"id"&lt;/span&gt;).Value,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum38"&gt;  38:&lt;/span&gt;                                                                  Text = xElement.Attribute(&lt;span style="color: #006080"&gt;"text"&lt;/span&gt;).Value,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum39"&gt;  39:&lt;/span&gt;                                                                  ActionName = xElement.Attribute(&lt;span style="color: #006080"&gt;"action"&lt;/span&gt;).Value,&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum40"&gt;  40:&lt;/span&gt;                                                                  ControllerName = xElement.Attribute(&lt;span style="color: #006080"&gt;"controller"&lt;/span&gt;).Value&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum41"&gt;  41:&lt;/span&gt;                                                              }).ToList();&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum42"&gt;  42:&lt;/span&gt;&amp;nbsp; &lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum43"&gt;  43:&lt;/span&gt;                 MainMenuItems = menuitems;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum44"&gt;  44:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum45"&gt;  45:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum46"&gt;  46:&lt;/span&gt;             {&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum47"&gt;  47:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;//TODO: logging&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum48"&gt;  48:&lt;/span&gt;             }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum49"&gt;  49:&lt;/span&gt;         }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum50"&gt;  50:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; ModuleName { get; set; }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum51"&gt;  51:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;MainMenuItemModel&amp;gt; MainMenuItems { get; set; }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum52"&gt;  52:&lt;/span&gt;     }&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum53"&gt;  53:&lt;/span&gt; }&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;每个模块的配置文件为{projectName}.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: '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;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;="1.0"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="utf-8"&lt;/span&gt; ?&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;!--CRLF--&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;module&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Module2"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;mainmenu&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;menu&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="modul2"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;text&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Team"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;action&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Index"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;controller&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Team"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;!--CRLF--&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;mainmenu&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;module&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;!--CRLF--&gt;    &lt;span style="color: #606060" id="lnum8"&gt;   8:&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;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;为了简单起见，只保留了注入主菜单的部分，为了让读者简单易懂。明白了以后你自己可以任意扩展&amp;#8230; &lt;p&gt;代码：IModuleConfigDictionary，接口&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136135553.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="dddd" alt="dddd" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136139391.png" border="0" height="327" width="508" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;模块配置文件{projectName}.config的位置：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136148801.png"&gt;&lt;img data-pinit="registered" style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Untitled" alt="Untitled" src="http://images.cnblogs.com/cnblogs_com/Mainz/201203/201203062136144275.png" border="0" height="508" width="266" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;为什么每个模块的Class library project都需要一个web.config呢？因为如果没有这个，那就没有Razor智能提示，大家可以参考这篇文章《&lt;a href="http://blogs.msdn.com/b/webdevtools/archive/2011/01/20/how-to-get-razor-intellisense-for-model-in-a-class-library-project.aspx" target="_blank"&gt;How to get Razor intellisense for @model in a class library project&lt;/a&gt;》。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;闲话几句插件式架构（Plugin Architecture）或者模块化（Modular）架构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;插件式架构（Plugin Architecture）或者模块化（Modular）架构是大型应用必须的架构，关于什么是Plugin，什么是模块化模式，这种架构的优缺点等我就不说了，自己百谷歌度。关于&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163476.aspx" target="_blank"&gt;.NET下面的插件式架构&lt;/a&gt;和模块化开发实现方法，基本上用&lt;a href="http://msdn.microsoft.com/library/ZH-CN/113A8BBF-6875-4A72-A49D-CA2D92E19CC8%28VS.100%29" target="_blank"&gt;AppDomain&lt;/a&gt;实现，当检测到一个新的插件Plugin时，实例化一个新的&lt;a href="http://msdn.microsoft.com/library/ZH-CN/113A8BBF-6875-4A72-A49D-CA2D92E19CC8%28VS.100%29" target="_blank"&gt;AppDomain&lt;/a&gt;并加载Assembly反射类等，由于&lt;a href="http://msdn.microsoft.com/library/ZH-CN/113A8BBF-6875-4A72-A49D-CA2D92E19CC8%28VS.100%29" target="_blank"&gt;AppDomain&lt;/a&gt;很好的隔离各个Plugin，所以跨域通信要用&lt;a href="http://msdn.microsoft.com/library/ZH-CN/SYSTEM.MARSHALBYREFOBJECT%28VS.100%29"&gt;MarshalByRefObject类&lt;/a&gt;，具体做法可以参考这篇文章《&lt;a href="http://www.cnblogs.com/kongyiyun/archive/2011/08/01/2123459.html" target="_blank"&gt;基于AppDomain的"插件式"开发&lt;/a&gt;》。另外，有很多框架提供了模块化/插件开发的框架，例如&lt;a href="http://compositewpf.codeplex.com/" target="_blank"&gt;Prism&lt;/a&gt;、&lt;a href="http://mef.codeplex.com/" target="_blank"&gt;MEF(Managed Extensibility Framework&lt;/a&gt;，.NET 4.0 内置)等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;客户端插件架构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还有一种插件架构是客户端插件架构（Javascript 模块化），如&lt;a href="http://ajpiano.com/widgetfactory/#slide1" target="_blank"&gt;jQuery UI Widget Factory&lt;/a&gt;，&lt;a href="http://silk.codeplex.com/" target="_blank"&gt;Silk Project&lt;/a&gt;就是很好的例子。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;本文源码下载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;源码下载请&lt;a href="http://files.cnblogs.com/Mainz/ModularWebApplication_Secure.7z" target="_blank"&gt;点击此处&lt;/a&gt;。运行源码之前务必阅读&lt;a href="http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/" target="_blank"&gt;此文&lt;/a&gt;和本文。注意：本文抛砖引玉，力求简单，易懂，并非完整的架构实现，更多丰富的功能实现一切皆有可能，只要在理解的基础上。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Mainz/aggbug/2382653.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Mainz/archive/2012/03/06/2382653.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><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;&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;&lt;/p&gt;&lt;p&gt;整个项目的结构如下图：&lt;/p&gt;&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;&lt;p&gt;在Controller中需要调用IBookService与IPhoneService: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/mainz/3r343.png" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Controller的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;Service.Interface;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;Mvc3_MEF_WebApplication.Controllers&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Export]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[PartCreationPolicy(CreationPolicy.NonShared)]&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&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;&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ImportingConstructor]&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;_bookService&amp;nbsp;=&amp;nbsp;bookService;&lt;br /&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;_phoneService&amp;nbsp;=&amp;nbsp;phoneService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;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;&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;&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;&lt;br /&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;return&lt;/span&gt;&amp;nbsp;View();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;return&lt;/span&gt;&amp;nbsp;View();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;BookService的实现：&lt;/p&gt;&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;&lt;p&gt;BookService的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;Data.Model;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;Service.Interface;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;Service.Implement&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Export(&lt;span style="color: #0000FF;"&gt;typeof&lt;/span&gt;(IBookService))]&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;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;&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;&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;&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;&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;&lt;br /&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;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;&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;&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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在Global.asax.cs里面需要设置MEF dependency resolver，自动加载所有bin目录下面的assembly/dll&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;AreaRegistration.RegisterAllAreas();&lt;br /&gt;&lt;br /&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;RegisterGlobalFilters(GlobalFilters.Filters);&lt;br /&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;RegisterRoutes(RouteTable.Routes);&lt;br /&gt;&lt;br /&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: #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;&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;&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;&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;&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;&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;&lt;br /&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;mefDependencySolver&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;MefDependencySolver(container);&lt;br /&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;DependencyResolver.SetResolver(mefDependencySolver);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;MefDependencySolver的代码：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.ComponentModel.Composition.Hosting;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Web.Mvc;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;Mvc3_MEF_WebApplication.Extension&lt;br /&gt;{&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;_compositionContainer&amp;nbsp;=&amp;nbsp;compositionContainer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&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;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;name&amp;nbsp;=&amp;nbsp;AttributedModelServices.GetContractName(serviceType);&lt;br /&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&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;return&lt;/span&gt;&amp;nbsp;_compositionContainer&lt;br /&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后系统运行的结果如下图：&lt;/p&gt;&lt;p&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/mainz/df3w34.png" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;总结一下所有的步骤：&lt;/p&gt;&lt;p&gt;1. 项目添加引用： System.ComponentModel.Composition&lt;/p&gt;&lt;p&gt;2. 为需要的Parts标注[Import] [Export] 等attribute&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 创建一个CompositionContainer实例&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. 实现IDependencyResolver接口&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. 注册到DependencyResolver&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更多资源&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本文的实现很简单，抛砖引玉，更多内容可以参考以下资料：&lt;/p&gt;&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;&lt;/p&gt;&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;&lt;/p&gt;&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;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;另外StackOverflow还有很多针对MEF高级议题(importMany集合导入, lazy惰性导入, composition/AllowMultiple复合,&amp;nbsp; metaData, lifetime等高级议题。)的讨论，可以参考下。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&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;&lt;/p&gt;&lt;p&gt;用MEF实现Asp.net MVC的模块化开发有兴趣可以参考 &lt;a href="http://www.fidelitydesign.net/?p=104"&gt;这篇文章&lt;/a&gt;。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&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;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&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;过度设计是敏捷开发应该避免的，很多工程师都有过度设计的冲动。例如，在一个web系统还没有看到被大规模使用的曙光以前，就设计了系统规模化，什么集群、负载均衡、读写分离、分布式缓存系统……说真的，这些东西确实是好东西，但也很贵。在系统还没有被大规模的用户接受和喜爱之前，这样做是否会抵消了我们把专注点放在核心功能和简练和简单的努力呢？时间是有限的，投资也是有限的。我们必须把有限的时间和有限的金钱用在当前最核心的功能和体验上。有时候系统初期，可能一两台服务器就足够了。只有在看到产品有被大规模使用和用户喜爱的曙光之后，才来增加功能和规模量。当然，你的网站功能，在你只有 10 万用户的时候，可能和你有 1 亿用户的时候会很不一样。所有太多太早太频繁的架构上的大动作可能会适得其反。这一点上，你要小心判断。系统架构需要及早规划，但不要提前实施和过早优化。&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;领导一般会给项目经理压力，要求在什么时间提交一个版本赶进度等，这时候项目经理要么能调整一些需求和范围（Scope），要么就把可能出现的问题进行报忧，因为现在如果不这样做，你就等着现在报喜，后期报忧吧。所以项目经理一定要严格控制需求和范围（scope），和进度，和质量权衡。同时要合理调配资源，不要出现项目进行中资源空闲的情况（这个在Project工具中可以看出）。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;项目风险管控&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;项目经理要有项目风险管控能力，及时在项目进行的各个阶段进行风险的预识别和管理。项目一般是前期工期松，风险低；而后期工期紧，风险高。所以项目经理要尽可能在项目早期能列出大部分的风险，这样在项目的风险应该是倒三角形状的，就是前期风险多，后期风险少。要预先把下阶段可能的风险明确告诉客户，让客户提供帮助来控制风险的发生，同时迫使客户加强风险意识，不让需求任意扩散和蔓延。在各个阶段都要有双方风险认知的会议纪要记录。一般情况下，项目的外部依赖条件是最不可管控的风险（比如要和第三方联调，要第三方提供API等）。其次是需求的不明确和需求蔓延的风险（需求问题占项目成功的40%因素以上，你能控制需求，你就成功60%了）。然后还有资源的可用性（如：项目进行中核心人员流失，要知道项目进行中间换人和加人都很是问题）。&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;有时候如果一个团队成员里面有多个牛人，大家都是很有主见的人，就很容易在一些问题上争执，甚至产生内部竞争。两个聪明人意见采取谁的呢？紧张关系在所难免。这种纠结的合作和竞争关系是同事关系的主线。但要保持合作为重点。所以，要把这样的状况保持在一个健康的状态，需要加深团队成员的亲密感。具体来说，坐在一起聊天、吃午餐、喝咖啡、散步、打球、打牌，都是增加亲密感的方法，这样拉近人与人的距离，就不会觉得有什么竞争的紧张感了。&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></feed>
