<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_家园</title><subtitle type="text">Design Patterns </subtitle><id>http://feed.cnblogs.com/blog/u/1970/rss</id><updated>2011-11-21T06:55:24Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/1970/rss"/><entry><id>http://www.cnblogs.com/umlchina/archive/2011/11/21/2257205.html</id><title type="text">prism框架里module太多启动速度过慢</title><summary type="text">一个基于prism框架desktop项目，总共有100多个module。程序启动的时候有几秒钟的delay。用的DirectoryModuleCatalog类从本地目录中装载module的程序集。附：DirectoryModuleCatalog装载部分源代码View Code //===================================================================================//Microsoftpatterns&amp;amp;practices//CompositeApplicationGuidanceforWindowsPre</summary><published>2011-11-21T06:55:00Z</published><updated>2011-11-21T06:55:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2011/11/21/2257205.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2011/11/21/2257205.html"/><content type="html">&lt;p&gt;一个基于prism框架desktop项目，总共有100多个module。程序启动的时候有几秒钟的delay。&lt;/p&gt;&#xD;
&lt;p&gt;用的DirectoryModuleCatalog类从本地目录中装载module的程序集。&lt;/p&gt;&#xD;
&lt;p&gt;附：DirectoryModuleCatalog装载部分源代码&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('f458e7d1-f4c2-43ee-b4d4-dcc2016ca6df')"&gt;&lt;img style="display: none" id="code_img_opened_f458e7d1-f4c2-43ee-b4d4-dcc2016ca6df"  onclick="cnblogs_code_hide('f458e7d1-f4c2-43ee-b4d4-dcc2016ca6df',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_f458e7d1-f4c2-43ee-b4d4-dcc2016ca6df" &gt;&#xD;
&lt;div&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;===================================================================================&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Microsoft&amp;nbsp;patterns&amp;nbsp;&amp;amp;&amp;nbsp;practices&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Composite&amp;nbsp;Application&amp;nbsp;Guidance&amp;nbsp;for&amp;nbsp;Windows&amp;nbsp;Presentation&amp;nbsp;Foundation&amp;nbsp;and&amp;nbsp;Silverlight&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;===================================================================================&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Copyright&amp;nbsp;(c)&amp;nbsp;Microsoft&amp;nbsp;Corporation.&amp;nbsp;&amp;nbsp;All&amp;nbsp;rights&amp;nbsp;reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;THIS&amp;nbsp;CODE&amp;nbsp;AND&amp;nbsp;INFORMATION&amp;nbsp;IS&amp;nbsp;PROVIDED&amp;nbsp;"AS&amp;nbsp;IS"&amp;nbsp;WITHOUT&amp;nbsp;WARRANTY&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;OF&amp;nbsp;ANY&amp;nbsp;KIND,&amp;nbsp;EITHER&amp;nbsp;EXPRESSED&amp;nbsp;OR&amp;nbsp;IMPLIED,&amp;nbsp;INCLUDING&amp;nbsp;BUT&amp;nbsp;NOT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;LIMITED&amp;nbsp;TO&amp;nbsp;THE&amp;nbsp;IMPLIED&amp;nbsp;WARRANTIES&amp;nbsp;OF&amp;nbsp;MERCHANTABILITY&amp;nbsp;AND&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;FITNESS&amp;nbsp;FOR&amp;nbsp;A&amp;nbsp;PARTICULAR&amp;nbsp;PURPOSE.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;===================================================================================&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;The&amp;nbsp;example&amp;nbsp;companies,&amp;nbsp;organizations,&amp;nbsp;products,&amp;nbsp;domain&amp;nbsp;names,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;e-mail&amp;nbsp;addresses,&amp;nbsp;logos,&amp;nbsp;people,&amp;nbsp;places,&amp;nbsp;and&amp;nbsp;events&amp;nbsp;depicted&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;herein&amp;nbsp;are&amp;nbsp;fictitious.&amp;nbsp;&amp;nbsp;No&amp;nbsp;association&amp;nbsp;with&amp;nbsp;any&amp;nbsp;real&amp;nbsp;company,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;organization,&amp;nbsp;product,&amp;nbsp;domain&amp;nbsp;name,&amp;nbsp;email&amp;nbsp;address,&amp;nbsp;logo,&amp;nbsp;person,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;places,&amp;nbsp;or&amp;nbsp;events&amp;nbsp;is&amp;nbsp;intended&amp;nbsp;or&amp;nbsp;should&amp;nbsp;be&amp;nbsp;inferred.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;===================================================================================&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&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.Globalization;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.IO;&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.Reflection;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Security.Policy;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;Microsoft.Practices.Prism.Properties;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;Microsoft.Practices.Prism.Modularity&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Represets&amp;nbsp;a&amp;nbsp;catalog&amp;nbsp;created&amp;nbsp;from&amp;nbsp;a&amp;nbsp;directory&amp;nbsp;on&amp;nbsp;disk.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;The&amp;nbsp;directory&amp;nbsp;catalog&amp;nbsp;will&amp;nbsp;scan&amp;nbsp;the&amp;nbsp;contents&amp;nbsp;of&amp;nbsp;a&amp;nbsp;directory,&amp;nbsp;locating&amp;nbsp;classes&amp;nbsp;that&amp;nbsp;implement&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;see&amp;nbsp;cref="IModule"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;and&amp;nbsp;add&amp;nbsp;them&amp;nbsp;to&amp;nbsp;the&amp;nbsp;catalog&amp;nbsp;based&amp;nbsp;on&amp;nbsp;contents&amp;nbsp;in&amp;nbsp;their&amp;nbsp;associated&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;see&amp;nbsp;cref="ModuleAttribute"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Assemblies&amp;nbsp;are&amp;nbsp;loaded&amp;nbsp;into&amp;nbsp;a&amp;nbsp;new&amp;nbsp;application&amp;nbsp;domain&amp;nbsp;with&amp;nbsp;ReflectionOnlyLoad.&amp;nbsp;&amp;nbsp;The&amp;nbsp;application&amp;nbsp;domain&amp;nbsp;is&amp;nbsp;destroyed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;once&amp;nbsp;the&amp;nbsp;assemblies&amp;nbsp;have&amp;nbsp;been&amp;nbsp;discovered.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;The&amp;nbsp;diretory&amp;nbsp;catalog&amp;nbsp;does&amp;nbsp;not&amp;nbsp;continue&amp;nbsp;to&amp;nbsp;monitor&amp;nbsp;the&amp;nbsp;directory&amp;nbsp;after&amp;nbsp;it&amp;nbsp;has&amp;nbsp;created&amp;nbsp;the&amp;nbsp;initialze&amp;nbsp;catalog.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&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;DirectoryModuleCatalog&amp;nbsp;:&amp;nbsp;ModuleCatalog&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: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Directory&amp;nbsp;containing&amp;nbsp;modules&amp;nbsp;to&amp;nbsp;search&amp;nbsp;for.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&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;string&lt;/span&gt;&amp;nbsp;ModulePath&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;;&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: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Drives&amp;nbsp;the&amp;nbsp;main&amp;nbsp;logic&amp;nbsp;of&amp;nbsp;building&amp;nbsp;the&amp;nbsp;child&amp;nbsp;domain&amp;nbsp;and&amp;nbsp;searching&amp;nbsp;for&amp;nbsp;the&amp;nbsp;assemblies.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&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;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;InnerLoad()&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;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ModulePath))&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;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;InvalidOperationException(Resources.ModulePathCannotBeNullOrEmpty);&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;if&lt;/span&gt;&amp;nbsp;(!Directory.Exists(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ModulePath))&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;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;InvalidOperationException(&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;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(CultureInfo.CurrentCulture,&amp;nbsp;Resources.DirectoryNotFound,&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ModulePath));&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;AppDomain&amp;nbsp;childDomain&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.BuildChildDomain(AppDomain.CurrentDomain);&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;try&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;loadedAssemblies&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;assemblies&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;&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;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;Assembly&amp;nbsp;assembly&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;AppDomain.CurrentDomain.GetAssemblies()&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;&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;where&lt;/span&gt;&amp;nbsp;!(assembly&amp;nbsp;&lt;span style="color: #0000ff"&gt;is&lt;/span&gt;&amp;nbsp;System.Reflection.Emit.AssemblyBuilder)&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;&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;amp;&amp;amp;&amp;nbsp;assembly.GetType().FullName&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;System.Reflection.Emit.InternalAssemblyBuilder&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!String.IsNullOrEmpty(assembly.Location)&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;&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;select&lt;/span&gt;&amp;nbsp;assembly.Location&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loadedAssemblies.AddRange(assemblies);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;loaderType&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(InnerModuleInfoLoader);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(loaderType.Assembly&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&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;{&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;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;loader&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(InnerModuleInfoLoader)&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;&amp;nbsp;childDomain.CreateInstanceFrom(loaderType.Assembly.Location,&amp;nbsp;loaderType.FullName).Unwrap();&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;loader.LoadAssemblies(loadedAssemblies);&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;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.Items.AddRange(loader.GetModuleInfos(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ModulePath));&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;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;&lt;span style="color: #0000ff"&gt;finally&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppDomain.Unload(childDomain);&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;&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: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Creates&amp;nbsp;a&amp;nbsp;new&amp;nbsp;child&amp;nbsp;domain&amp;nbsp;and&amp;nbsp;copies&amp;nbsp;the&amp;nbsp;evidence&amp;nbsp;from&amp;nbsp;a&amp;nbsp;parent&amp;nbsp;domain.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;param&amp;nbsp;name="parentDomain"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;The&amp;nbsp;parent&amp;nbsp;domain.&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;The&amp;nbsp;new&amp;nbsp;child&amp;nbsp;domain.&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Grabs&amp;nbsp;the&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;paramref&amp;nbsp;name="parentDomain"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;evidence&amp;nbsp;and&amp;nbsp;uses&amp;nbsp;it&amp;nbsp;to&amp;nbsp;construct&amp;nbsp;the&amp;nbsp;new&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;see&amp;nbsp;cref="AppDomain"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;because&amp;nbsp;in&amp;nbsp;a&amp;nbsp;ClickOnce&amp;nbsp;execution&amp;nbsp;environment,&amp;nbsp;creating&amp;nbsp;an&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;see&amp;nbsp;cref="AppDomain"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;will&amp;nbsp;by&amp;nbsp;default&amp;nbsp;pick&amp;nbsp;up&amp;nbsp;the&amp;nbsp;partial&amp;nbsp;trust&amp;nbsp;environment&amp;nbsp;of&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;the&amp;nbsp;AppLaunch.exe,&amp;nbsp;which&amp;nbsp;was&amp;nbsp;the&amp;nbsp;root&amp;nbsp;executable.&amp;nbsp;The&amp;nbsp;AppLaunch.exe&amp;nbsp;does&amp;nbsp;a&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;create&amp;nbsp;domain&amp;nbsp;and&amp;nbsp;applies&amp;nbsp;the&amp;nbsp;evidence&amp;nbsp;from&amp;nbsp;the&amp;nbsp;ClickOnce&amp;nbsp;manifests&amp;nbsp;to&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;create&amp;nbsp;the&amp;nbsp;domain&amp;nbsp;that&amp;nbsp;the&amp;nbsp;application&amp;nbsp;is&amp;nbsp;actually&amp;nbsp;executing&amp;nbsp;in.&amp;nbsp;This&amp;nbsp;will&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;need&amp;nbsp;to&amp;nbsp;be&amp;nbsp;Full&amp;nbsp;Trust&amp;nbsp;for&amp;nbsp;Composite&amp;nbsp;Application&amp;nbsp;Library&amp;nbsp;applications.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;exception&amp;nbsp;cref="ArgumentNullException"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;An&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;see&amp;nbsp;cref="ArgumentNullException"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;is&amp;nbsp;thrown&amp;nbsp;if&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;paramref&amp;nbsp;name="parentDomain"/&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;is&amp;nbsp;null.&lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/exception&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br /&gt;&lt;/span&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;virtual&lt;/span&gt;&amp;nbsp;AppDomain&amp;nbsp;BuildChildDomain(AppDomain&amp;nbsp;parentDomain)&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;if&lt;/span&gt;&amp;nbsp;(parentDomain&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;System.ArgumentNullException(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;parentDomain&lt;/span&gt;&lt;span style="color: #800000"&gt;"&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;Evidence&amp;nbsp;evidence&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;Evidence(parentDomain.Evidence);&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;AppDomainSetup&amp;nbsp;setup&amp;nbsp;=&amp;nbsp;parentDomain.SetupInformation;&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;AppDomain.CreateDomain(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;DiscoveryRegion&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;evidence,&amp;nbsp;setup);&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;class&lt;/span&gt;&amp;nbsp;InnerModuleInfoLoader&amp;nbsp;:&amp;nbsp;MarshalByRefObject&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;[System.Diagnostics.CodeAnalysis.SuppressMessage(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Microsoft.Performance&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CA1822:MarkMembersAsStatic&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;internal&lt;/span&gt;&amp;nbsp;ModuleInfo[]&amp;nbsp;GetModuleInfos(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;path)&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;DirectoryInfo&amp;nbsp;directory&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;DirectoryInfo(path);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResolveEventHandler&amp;nbsp;resolveEventHandler&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;ResolveEventArgs&amp;nbsp;args)&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;OnReflectionOnlyResolve(args,&amp;nbsp;directory);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve&amp;nbsp;+=&amp;nbsp;resolveEventHandler;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assembly&amp;nbsp;moduleReflectionOnlyAssembly&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies().First(&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;&amp;nbsp;asm&amp;nbsp;=&amp;gt;&amp;nbsp;asm.FullName&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(IModule).Assembly.FullName);&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;Type&amp;nbsp;IModuleType&amp;nbsp;=&amp;nbsp;moduleReflectionOnlyAssembly.GetType(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(IModule).FullName);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerable&amp;lt;ModuleInfo&amp;gt;&amp;nbsp;modules&amp;nbsp;=&amp;nbsp;GetNotAllreadyLoadedModuleInfos(directory,&amp;nbsp;IModuleType);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;array&amp;nbsp;=&amp;nbsp;modules.ToArray();&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;AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve&amp;nbsp;-=&amp;nbsp;resolveEventHandler;&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;return&lt;/span&gt;&amp;nbsp;array;&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;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;ModuleInfo&amp;gt;&amp;nbsp;GetNotAllreadyLoadedModuleInfos(DirectoryInfo&amp;nbsp;directory,&amp;nbsp;Type&amp;nbsp;IModuleType)&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;List&amp;lt;FileInfo&amp;gt;&amp;nbsp;validAssemblies&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;FileInfo&amp;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;Assembly[]&amp;nbsp;alreadyLoadedAssemblies&amp;nbsp;=&amp;nbsp;AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;fileInfos&amp;nbsp;=&amp;nbsp;directory.GetFiles(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;*.dll&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Where(file&amp;nbsp;=&amp;gt;&amp;nbsp;alreadyLoadedAssemblies&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;&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;.FirstOrDefault(&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;&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;assembly&amp;nbsp;=&amp;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;&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;String.Compare(Path.GetFileName(assembly.Location),&amp;nbsp;file.Name,&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringComparison.OrdinalIgnoreCase)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080"&gt;0&lt;/span&gt;)&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&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;&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;foreach&lt;/span&gt;&amp;nbsp;(FileInfo&amp;nbsp;fileInfo&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;fileInfos)&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;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;Assembly&amp;nbsp;assembly&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assembly&amp;nbsp;=&amp;nbsp;Assembly.ReflectionOnlyLoadFrom(fileInfo.FullName);&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;&amp;nbsp;validAssemblies.Add(fileInfo);&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;}&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;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(BadImageFormatException)&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;{&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;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;skip&amp;nbsp;non-.NET&amp;nbsp;Dlls&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;&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;}&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;validAssemblies.SelectMany(file&amp;nbsp;=&amp;gt;&amp;nbsp;Assembly.ReflectionOnlyLoadFrom(file.FullName)&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;&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;.GetExportedTypes()&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;&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;.Where(IModuleType.IsAssignableFrom)&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;&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;.Where(t&amp;nbsp;=&amp;gt;&amp;nbsp;t&amp;nbsp;!=&amp;nbsp;IModuleType)&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;&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;.Where(t&amp;nbsp;=&amp;gt;&amp;nbsp;!t.IsAbstract)&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;&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;.Select(type&amp;nbsp;=&amp;gt;&amp;nbsp;CreateModuleInfo(type)));&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;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;Assembly&amp;nbsp;OnReflectionOnlyResolve(ResolveEventArgs&amp;nbsp;args,&amp;nbsp;DirectoryInfo&amp;nbsp;directory)&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;Assembly&amp;nbsp;loadedAssembly&amp;nbsp;=&amp;nbsp;AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies().FirstOrDefault(&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;asm&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Equals(asm.FullName,&amp;nbsp;args.Name,&amp;nbsp;StringComparison.OrdinalIgnoreCase));&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;if&lt;/span&gt;&amp;nbsp;(loadedAssembly&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&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;{&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;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;loadedAssembly;&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;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;AssemblyName&amp;nbsp;assemblyName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;AssemblyName(args.Name);&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;string&lt;/span&gt;&amp;nbsp;dependentAssemblyFilename&amp;nbsp;=&amp;nbsp;Path.Combine(directory.FullName,&amp;nbsp;assemblyName.Name&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;.dll&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(File.Exists(dependentAssemblyFilename))&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;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;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;Assembly.ReflectionOnlyLoadFrom(dependentAssemblyFilename);&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;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;return&lt;/span&gt;&amp;nbsp;Assembly.ReflectionOnlyLoad(args.Name);&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;[System.Diagnostics.CodeAnalysis.SuppressMessage(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;Microsoft.Performance&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;CA1822:MarkMembersAsStatic&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;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;LoadAssemblies(IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;assemblies)&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;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;assemblyPath&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;assemblies)&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;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;&lt;span style="color: #0000ff"&gt;try&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assembly.ReflectionOnlyLoadFrom(assemblyPath);&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;}&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;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(FileNotFoundException)&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;{&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;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;Continue&amp;nbsp;loading&amp;nbsp;assemblies&amp;nbsp;even&amp;nbsp;if&amp;nbsp;an&amp;nbsp;assembly&amp;nbsp;can&amp;nbsp;not&amp;nbsp;be&amp;nbsp;loaded&amp;nbsp;in&amp;nbsp;the&amp;nbsp;new&amp;nbsp;AppDomain&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;&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;}&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;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;ModuleInfo&amp;nbsp;CreateModuleInfo(Type&amp;nbsp;type)&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;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;moduleName&amp;nbsp;=&amp;nbsp;type.Name;&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;List&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;dependsOn&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;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;&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;nbsp;onDemand&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;false&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;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;moduleAttribute&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomAttributeData.GetCustomAttributes(type).FirstOrDefault(&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;&amp;nbsp;cad&amp;nbsp;=&amp;gt;&amp;nbsp;cad.Constructor.DeclaringType.FullName&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ModuleAttribute).FullName);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(moduleAttribute&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&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;{&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;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(CustomAttributeNamedArgument&amp;nbsp;argument&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;moduleAttribute.NamedArguments)&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;{&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;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;argumentName&amp;nbsp;=&amp;nbsp;argument.MemberInfo.Name;&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;&amp;nbsp;&lt;span style="color: #0000ff"&gt;switch&lt;/span&gt;&amp;nbsp;(argumentName)&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;&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;&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;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;ModuleName&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;&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;moduleName&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)&amp;nbsp;argument.TypedValue.Value;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;break&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;&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;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;OnDemand&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;&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;onDemand&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;)&amp;nbsp;argument.TypedValue.Value;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;break&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;&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;case&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;StartupLoaded&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;&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;onDemand&amp;nbsp;=&amp;nbsp;!((&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;)&amp;nbsp;argument.TypedValue.Value);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;break&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;&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;&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;&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;}&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;moduleDependencyAttributes&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CustomAttributeData.GetCustomAttributes(type).Where(&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;&amp;nbsp;cad&amp;nbsp;=&amp;gt;&amp;nbsp;cad.Constructor.DeclaringType.FullName&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(ModuleDependencyAttribute).FullName);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(CustomAttributeData&amp;nbsp;cad&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;moduleDependencyAttributes)&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;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;dependsOn.Add((&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;)&amp;nbsp;cad.ConstructorArguments[&lt;span style="color: #800080"&gt;0&lt;/span&gt;].Value);&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ModuleInfo&amp;nbsp;moduleInfo&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;ModuleInfo(moduleName,&amp;nbsp;type.AssemblyQualifiedName)&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;&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;{&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;&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;&amp;nbsp;&amp;nbsp;InitializationMode&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;&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;&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;onDemand&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?&amp;nbsp;InitializationMode.OnDemand&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;InitializationMode.WhenAvailable,&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;&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;&amp;nbsp;&amp;nbsp;Ref&amp;nbsp;=&amp;nbsp;type.Assembly.CodeBase,&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;&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;};&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;moduleInfo.DependsOn.AddRange(dependsOn);&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;return&lt;/span&gt;&amp;nbsp;moduleInfo;&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;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;初步怀疑是在这里花费了太多的时间。&lt;/p&gt;&#xD;
&lt;p&gt;解决方式：&lt;/p&gt;&#xD;
&lt;p&gt;准备使用xaml文件来存储modules的配置信息。第一次启动程序当模块装载成功以后，创建一个xaml配置文件。&lt;/p&gt;&#xD;
&lt;p&gt;以后启动程序不再遍历目录，之间从xaml文件读取配置信息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&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.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;Microsoft.Practices.Prism.Modularity;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.IO;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;&amp;nbsp;ModularityWithUnity.Desktop&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;ModuleCatalogConfigXAML&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;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;SPACE_STRING_4&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;SPACE_STRING_8&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;ModuleCatalog&amp;nbsp;moduleCatalog;&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;StringBuilder&amp;nbsp;sb;&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;ModuleCatalogConfigXAML(ModuleCatalog&amp;nbsp;moduleCatalog)&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;sb&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;StringBuilder();&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;this&lt;/span&gt;.moduleCatalog&amp;nbsp;=&amp;nbsp;moduleCatalog;&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;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;GenerateXAMLConfigFile(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;fileFullPath)&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;BuildHeader();&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;BuildGroups();&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;BuildByGroupless();&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;BuildFooter();&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;SaveAsFile(fileFullPath,&amp;nbsp;sb.ToString());&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;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;SaveAsFile(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;savedPath,&amp;nbsp;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;content)&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;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;using&lt;/span&gt;&amp;nbsp;(StreamWriter&amp;nbsp;sw&amp;nbsp;=&amp;nbsp;File.CreateText(savedPath))&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;sw.Write(content);&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;&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;void&lt;/span&gt;&amp;nbsp;BuildHeader()&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;sb.AppendLine(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;Modularity:ModuleCatalog&amp;nbsp;xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"&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;sb.AppendLine(SPACE_STRING_8&amp;nbsp;+&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"&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;sb.AppendLine(SPACE_STRING_8&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"&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;sb.AppendLine(SPACE_STRING_8&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;xmlns:Modularity=\"clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism\"&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&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;}&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;void&lt;/span&gt;&amp;nbsp;BuildFooter()&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;sb.AppendLine(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/Modularity:ModuleCatalog&amp;gt;&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;}&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;void&lt;/span&gt;&amp;nbsp;BuildGroups()&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;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;group&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;moduleCatalog.Groups)&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;BuildByGroup(group);&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;&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;void&lt;/span&gt;&amp;nbsp;BuildByGroup(ModuleInfoGroup&amp;nbsp;group)&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: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;IEnumerable&amp;lt;ModuleInfoGroup&amp;gt;&amp;nbsp;groups&amp;nbsp;=&amp;nbsp;this.moduleCatalog.Groups;&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;sb.AppendLine(SPACE_STRING_4&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;Modularity:ModuleInfoGroup&amp;nbsp;&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;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(group.Ref))&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;sb.Append(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;Ref=\"&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;group.Ref&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\"&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;sb.Append(&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;InitializationMode=\"&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;group.InitializationMode.ToString()&amp;nbsp;+&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\"&amp;gt;&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;IEnumerator&amp;lt;ModuleInfo&amp;gt;&amp;nbsp;moduleInfos&amp;nbsp;=&amp;nbsp;group.GetEnumerator();&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;&lt;span style="color: #0000ff"&gt;while&lt;/span&gt;(moduleInfos.MoveNext())&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;BuildModule(moduleInfos.Current,SPACE_STRING_8);&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;&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;void&lt;/span&gt;&amp;nbsp;BuildByGroupless()&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;IEnumerable&amp;lt;ModuleInfo&amp;gt;&amp;nbsp;groupLessModules&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.moduleCatalog.Items.OfType&amp;lt;ModuleInfo&amp;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;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;moduleInfo&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;groupLessModules)&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;BuildModule(&amp;nbsp;moduleInfo,SPACE_STRING_4);&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;&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;void&lt;/span&gt;&amp;nbsp;BuildModule(ModuleInfo&amp;nbsp;moduleInfo,&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;space)&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;sb.AppendLine(space&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;!--&amp;nbsp;Module&amp;nbsp;info&amp;nbsp;without&amp;nbsp;a&amp;nbsp;group&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&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;string&lt;/span&gt;&amp;nbsp;content&amp;nbsp;=&amp;nbsp;space&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;Modularity:ModuleInfo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&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;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;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(moduleInfo.Ref))&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;content&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;Ref=\"&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;moduleInfo.Ref&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\"&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;if&lt;/span&gt;&amp;nbsp;(!&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.IsNullOrEmpty(moduleInfo.ModuleName))&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;content&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;ModuleName=\"&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;moduleInfo.ModuleName&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\"&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;content&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;nbsp;ModuleType=\"&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;moduleInfo.ModuleType&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;\"&amp;nbsp;&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&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;sb.AppendLine(content);&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;if&lt;/span&gt;&amp;nbsp;(moduleInfo.DependsOn&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;moduleInfo.DependsOn.Count&amp;gt;&lt;span style="color: #800080"&gt;0&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendLine(space&amp;nbsp;+&amp;nbsp;SPACE_STRING_4&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;Modularity:ModuleInfo.DependsOn&amp;gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;var&lt;/span&gt;&amp;nbsp;item&amp;nbsp;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;moduleInfo.DependsOn)&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;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;sb.AppendLine(space&amp;nbsp;+&amp;nbsp;SPACE_STRING_4&amp;nbsp;+&amp;nbsp;SPACE_STRING_4&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;sys:String&amp;gt;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;item&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/sys:String&amp;gt;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendLine(space&amp;nbsp;+&amp;nbsp;SPACE_STRING_4&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/Modularity:ModuleInfo.DependsOn&amp;gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendLine(space&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/Modularity:ModuleInfo&amp;gt;&amp;nbsp;&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;&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;sb.AppendLine(space&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;&amp;lt;/Modularity:ModuleInfo&amp;gt;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;sb.Append("&amp;nbsp;/&amp;gt;");&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;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;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用的时候： &lt;/p&gt;&#xD;
&lt;p&gt;UnityBootstrapper&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.虚方法CreateModuleCatalog 用来返回ModuleCatalog类。&lt;br /&gt;&amp;nbsp;&amp;nbsp;在此方法中添加逻辑如下：&lt;br /&gt;如果modules的配置文件已经存在，则通过配置文件来生成ModuleCatalog.&lt;br /&gt;2.虚方法InitializeModules装载模块信息，在此方法后调用GenerateXAMLConfigFile 生成模块配置文件。&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/umlchina/aggbug/2257205.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2011/11/21/2257205.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2011/11/21/2257151.html</id><title type="text">Localizing of WPF application</title><summary type="text">The main WPF thread will always be assigned a default setting for CurrentCulture and CurrentUICulture. You can also explicitly set these values based on user preferences (to be discussed). An important point to note, however, is that if a WPF application spins up new threads, those threads will not </summary><published>2011-11-21T06:11:00Z</published><updated>2011-11-21T06:11:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2011/11/21/2257151.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2011/11/21/2257151.html"/><content type="html">The main WPF thread will always be assigned a default setting for CurrentCulture and CurrentUICulture. You can also explicitly set these values based on user preferences (to be discussed). An important point to note, however, is that if a WPF application spins up new threads, those threads will not inherit the main UI thread&amp;#8217;s culture settings, in fact they will not be set at all! So, be sure to explicitly assign new threads with the appropriate values.&lt;img src="http://www.cnblogs.com/umlchina/aggbug/2257151.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2011/11/21/2257151.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2011/11/19/2255136.html</id><title type="text">Unity 中的拦截功能</title><summary type="text">Dino Esposito 在上个月的专栏中，我简要介绍了 Unity 2.0 依赖关系注入容器使用的拦截机制。 在演示面向方面的编程 (AOP) 的核心概念之后，我介绍了一个具体的拦截示例，可能符合如今的很多开发人员的需要。 您是否想要扩展现有代码的行为却不想以任何方式触及源代码？ 您是否希望围绕现有的代码再运行更多代码？ AOP 的目标是提供一种方法，将核心代码与其他干扰核心业务逻辑的内容隔离开。 Unity 2.0 提供基于 Microsoft .NET Framework 4 的框架来实现此目的，而且极其快速和方便。 为了使您完全理解这篇后续文章的目的，我先概要介绍上个月的内容。 您.</summary><published>2011-11-19T05:35:00Z</published><updated>2011-11-19T05:35:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2011/11/19/2255136.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2011/11/19/2255136.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl01" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_ctl00|ctl00_MTContentSelector1_mainContentContainer_ctl01',this);" href="http://www.cnblogs.com/magazine/ee532098.aspx?sdmr=DinoEsposito&amp;amp;sdmi=authors"&gt;&lt;span id="xn3_4dd148710d772e775d5ef94febbe7fc5" &gt;&lt;font color="#0066dd"&gt;Dino Esposito&lt;/font&gt;&lt;/span&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg535676.dino_esposito_headshot(en-us,MSDN.10).jpg" /&gt; &lt;span id="xn4_c52ab02a52bed7c2ca58945fd561e70a" &gt;在&lt;a id="ctl00_MTContentSelector1_mainContentContainer_ctl03" onclick="javascript:Track('ctl00_MTContentSelector1_mainContentContainer_tgt4|ctl00_MTContentSelector1_mainContentContainer_ctl03',this);" href="http://www.cnblogs.com/umlchina/admin/gg491225.aspx"&gt;&lt;font color="#0066dd"&gt;上个月的专栏&lt;/font&gt;&lt;/a&gt;中，我简要介绍了 Unity 2.0 依赖关系注入容器使用的拦截机制。&lt;/span&gt; &lt;span id="xn5_c15f4f8680766d149452295e1f81d71b" &gt;在演示面向方面的编程 (AOP) 的核心概念之后，我介绍了一个具体的拦截示例，可能符合如今的很多开发人员的需要。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn6_5949378d36939024d42d9755d55bf1b3" &gt;您是否想要扩展现有代码的行为却不想以任何方式触及源代码？&lt;/span&gt; &lt;span id="xn7_98a7802e46f8c0ece4ef837b8658c743" &gt;您是否希望围绕现有的代码再运行更多代码？&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn8_2b78f68e360a025cf8fdf88d40ad5646" &gt;AOP 的目标是提供一种方法，将核心代码与其他干扰核心业务逻辑的内容隔离开。&lt;/span&gt; &lt;span id="xn9_a29b34524bdf3e26376eb04cb32c3755" &gt;Unity 2.0 提供基于 Microsoft .NET Framework 4 的框架来实现此目的，而且极其快速和方便。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn10_70b5d4e50b05a4fb4e7df6aa33e84bd4" &gt;为了使您完全理解这篇后续文章的目的，我先概要介绍上个月的内容。&lt;/span&gt; &lt;span id="xn11_d1f3826df1c4ac3f204cf37b43be14bd" &gt;您会发现，在上个月的代码中，我作了一些假设并使用了一些默认组件。&lt;/span&gt; &lt;span id="xn12_55fe5a64cb0eb0f79110afaf2f0e4af8" &gt;这个月我将回过头去更详细地讨论您通常会遇到的选择和选项。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn13_419570055cb05cabacd7b965927bf13d" &gt;Unity 中的 AOP&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn14_e09c53592ace87ed30390eb41afe1169" &gt;假设您已经部署了应用程序，以便在某个时刻执行一些与业务相关的操作。&lt;/span&gt; &lt;span id="xn15_8e2197b3278f68112664950c51902f90" &gt;一天，您的客户要求扩展该行为，以便执行更多工作。&lt;/span&gt; &lt;span id="xn16_b9adae4f87efc568fdcca877fdf9698e" &gt;您找出源代码，进行修改，然后按照编码和测试新功能所需的时间来收取咨询费用。&lt;/span&gt; &lt;span id="xn17_54f58f1d3e5fe80b1ff5811d3b21f59a" &gt;但如果您能顺利添加新的行为而不用触及现有的源代码，岂不是更好？&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn18_629d38e54b10e92857f14eb66cd5f405" &gt;考虑一下稍有不同的情况。&lt;/span&gt; &lt;span id="xn19_3ae98f18cb516cca4354778959ace81f" &gt;首先，如果您并不是独立顾问而是全职公司员工，该怎么办呢？&lt;/span&gt; &lt;span id="xn20_9025d3b8b6d6f566d29c1d6808789322" &gt;收到的更改请求越多，您就得在现有项目之外花费越多的时间；更糟糕的是，您还得面临为基本代码创建新分支（并不是必需的）的风险。&lt;/span&gt; &lt;span id="xn21_a0ca898e5dd7282c41722901588c9a11" &gt;因此，您会由衷地喜欢可以让您顺利添加新的行为却无需触及源代码的解决方案。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn22_c722fc17bbd12ec74f6f85cf3df33a11" &gt;最后，假设有人报告了错误或严重的性能问题。&lt;/span&gt; &lt;span id="xn23_83f3e95b790b0a9124f87843ebe40cee" &gt;您需要调查并修正问题，而且您希望它不会引人注意。&lt;/span&gt; &lt;span id="xn24_66443214fd821d0c99e84b2c2be8392a" &gt;在这种情况下，您同样期望能够顺利添加新的行为而不用触及源代码。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn25_0099d53ebda78ac41931d11bf2b253bc" &gt;AOP 可以帮助您应对所有这些情况。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn26_3fcf8de541ef2b0cc12a9dd926743229" &gt;上个月，我演示了如何利用 Unity 2.0 中的拦截 API 围绕现有方法添加预处理和后处理代码，而不用触及该方法。&lt;/span&gt; &lt;span id="xn27_7884fc29e69f1259905efb9695284bc7" &gt;但这段简短的演示利用了几个假设。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn28_96daeb124c5f5b88a9b3fb76d282ceff" &gt;首先，它利用由 Unity 反转控制 (IoC) 基础结构注册的类型，并通过 Unity 工厂层进行实例化。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn29_c7978ec326642c1f73ce51c511e7bf18" &gt;其次，联接点集合只是通过接口定义的。&lt;/span&gt; &lt;span id="xn30_5595adcd4ba6455c8efc4519cccd152d" &gt;在 AOP 术语中，联接点集合代表目标类中的位置集合，而框架就在这些位置按需注入额外的行为。&lt;/span&gt; &lt;span id="xn31_915ee68ec5d3bdd248ec7d32dbf2f3dd" &gt;基于接口的联接点集合表示只有该接口的成员才会通过代码注入在运行时扩展。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn32_6bee0dabb445cea9db8faa40a5c6fb3a" &gt;第三，我主要关注支持拦截的配置设置，而没有考虑能够让您在代码中配置 Unity 的 Fluent API。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn33_1b83699eb78d93c945d7c458d46b6105" &gt;在本文的其余部分，我将探讨 Fluent API 以及定义 Unity 拦截功能的其他方法。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn34_024915dc81a8ec8d3403aeef2381c1b6" &gt;可拦截的实例&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn35_a36c7e4dc42c8f16f75c1a3e5bbe798e" &gt;若要为现有的类实例或新创建的类实例添加新的行为，您必须对工厂有一定的控制力。&lt;/span&gt; &lt;span id="xn36_85385c4d0f5396434fb390289eb19e4a" &gt;换句话说，AOP 不是万能的，您不可能绑定通过标准的 new 运算符实例化的普通 CLR 类：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="8"&gt;&lt;code  jquery1321680854187="7"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;calculator&amp;nbsp;=&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;Calculator();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn38_ebb02c6e268ead87d87b99834770ef45" &gt;AOP 框架控制实例的方式可能大有不同。&lt;/span&gt; &lt;span id="xn39_581b55d77f5d6457e211db6644189a7f" &gt;在 Unity 中，您可以求助于某些返回原始对象代理的显式调用，或者让代码完全在 IoC 框架之后运行。&lt;/span&gt; &lt;span id="xn40_734424c7efbf858d1cf129cc2f6a0022" &gt;为此，大多数 IoC 框架都提供 AOP 功能。&lt;/span&gt; &lt;span id="xn41_e8a9d2a5d23201b5f63743e1f996cbf6" &gt;Spring.NET 和 Unity 就是两个示例。&lt;/span&gt; &lt;span id="xn42_192989f65fac3f6ca9c094fbbf8cd8d9" &gt;当 AOP 和 IoC 一起使用时，就会得到顺利、轻松和有效的编码体验。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn43_a258739fceede5824a6823312ef33c3d" &gt;我们先从一个示例开始，其中没有使用 IoC 功能。&lt;/span&gt; &lt;span id="xn44_ce16650d2290ea2bb05d6cbaaba765b0" &gt;这里是一些基本代码，可以让现有的 Calculator 类实例变得可以拦截：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="18"&gt;&lt;code  jquery1321680854187="17"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;calculator&amp;nbsp;=&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;Calculator();&lt;/li&gt;&lt;li&gt;var&amp;nbsp;calculatorProxy&amp;nbsp;=&amp;nbsp;Intercept.ThroughProxy&amp;lt;ICalculator&amp;gt;(calculator,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;InterfaceInterceptor(),&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;LogBehavior()&amp;nbsp;});&lt;/li&gt;&lt;li&gt;Console.WriteLine(calculatorProxy.Sum(&lt;span &gt;&lt;font color="#ff0000"&gt;2&lt;/font&gt;&lt;/span&gt;,&amp;nbsp;&lt;span &gt;&lt;font color="#ff0000"&gt;2&lt;/font&gt;&lt;/span&gt;));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn46_7bb8218c7c5eb9c8586b8fd7a28d97f7" &gt;最后要处理一个包装了原始对象的可拦截代理。&lt;/span&gt; &lt;span id="xn47_a7a408acdcb8ca3c093649677ea1fdf8" &gt;在这种情况下，我假设 Calculator 类实现 ICalculator 接口。&lt;/span&gt; &lt;span id="xn48_ff184ff802b9f116bb822879b11f3f7f" &gt;若要变得可拦截，类必须实现接口或者继承自 MarshalByRefObject。&lt;/span&gt; &lt;span id="xn49_a97f6d4589231ca81872bbf89057caf1" &gt;如果类派生自 MarshalByRefObject，那么拦截程序的类型必须是 TransparentProxyInterceptor：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="20"&gt;&lt;code  jquery1321680854187="19"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;calculator&amp;nbsp;=&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;Calculator();&lt;/li&gt;&lt;li&gt;var&amp;nbsp;calculatorProxy&amp;nbsp;=&amp;nbsp;Intercept.ThroughProxy(calculator,&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;TransparentProxyInterceptor(),&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;LogBehavior()&amp;nbsp;});&lt;/li&gt;&lt;li&gt;Console.WriteLine(calculatorProxy.Sum(&lt;span &gt;&lt;font color="#ff0000"&gt;2&lt;/font&gt;&lt;/span&gt;,&amp;nbsp;&lt;span &gt;&lt;font color="#ff0000"&gt;2&lt;/font&gt;&lt;/span&gt;));&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn51_e3dd7db129bee400f6eabfe6ef7e3b68" &gt;Intercept 类还提供 NewInstance 方法，您可以调用该方法以更直接的方式创建可拦截的对象。&lt;/span&gt; &lt;span id="xn52_24c25bcc2525a7f299c00aab92bc8a98" &gt;以下就是使用方法：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="22"&gt;&lt;code  jquery1321680854187="21"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;calculatorProxy&amp;nbsp;=&amp;nbsp;Intercept.NewInstance&amp;lt;Calculator&amp;gt;(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;VirtualMethodInterceptor(),&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;LogBehavior()&amp;nbsp;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn54_49be12b0379324ef2761f9ce2e413b46" &gt;请注意，当您使用 NewInstance 时，拦截程序组件必须稍有不同。它不能是 InterfaceInterceptor，也不能是 TransparentProxyInterceptor，而应该是 VirtualMethodInterceptor 对象。&lt;/span&gt; &lt;span id="xn55_52f647ea3a285ffff8971c6d9ae6fcbc" &gt;那么 Unity 中有多少种拦截程序？&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn56_1527d71f9f985ebe1aad8c366620f9b3" &gt;实例和类型拦截程序&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn57_2e4af4eea6255e071bb60400a2431778" &gt;拦截程序是一种 Unity 组件，该组件负责捕获对目标对象的原始调用并通过行为管道进行路由，使得每个行为都有机会在常规方法调用之前或之后运行。&lt;/span&gt; &lt;span id="xn58_4a8f1395b4b744e8ce85ab755add3588" &gt;拦截的类型有两种：实例拦截和类型拦截。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn59_ebd62d0d69b875f2e7a4249ec342ef3c" &gt;实例拦截程序创建代理以筛选针对所拦截实例的传入调用。&lt;/span&gt; &lt;span id="xn60_e4e01c90863aace7c8778ed6919fbd30" &gt;类型拦截程序生成新的类（这个类派生自要拦截的类型），并处理该派生类型的实例。&lt;/span&gt; &lt;span id="xn61_53597d0619ca8d42eb2d955b60e92af6" &gt;不用说，原始类型和派生类型的区别就在于用来筛选传入调用的逻辑。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn62_eeef61555b44fbeaa924694a2e8e986c" &gt;对于实例拦截，应用程序代码首先使用传统的工厂（或 new 运算符）创建目标对象，然后强制通过 Unity 提供的代理与其交互。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn63_a1b4b37e8c9e50e55aa9423900604359" &gt;对于类型拦截，应用程序通过 API 或 Unity 创建目标对象，然后处理该实例。&lt;/span&gt; &lt;span id="xn64_5d07ff63012a99440938e1a9279e53bd" &gt;（您无法使用 new 运算符直接创建对象并获得类型拦截。）但是目标对象不是原始类型。&lt;/span&gt; &lt;span id="xn65_83f004024434e4d7afeac60f70864ab5" &gt;实际的类型由 Unity 实时派生，并且会加入拦截逻辑（请参见&lt;strong&gt;图 1&lt;/strong&gt;）。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg535676.Esposito_Figure1_hires(en-us,MSDN.10).jpg" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn66_3a0d3065710bdb8c1f414ced487eadb1" &gt;图 1 &lt;strong&gt;实例拦截程序和类型拦截程序&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn67_49b9f1a074f13a6c06d8327d32e47e5b" &gt;InterfaceInterceptor 和 TransparentProxyInterceptor 是两个 Unity 拦截程序，属于实例拦截程序类别。&lt;/span&gt; &lt;span id="xn68_6ed7d59ded9c17155d6e68a83769a3d8" &gt;VirtualMethodInterceptor 属于类型拦截程序类别。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn69_234138872c9d8dde5ba5e83d7e17f6b9" &gt;InterfaceInterceptor 可以拦截目标对象上的一个接口的公共实例方法。&lt;/span&gt; &lt;span id="xn70_8e2bfa3ca68b8aab670c2432cc30d110" &gt;该拦截程序可以应用到新的和现有的实例。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn71_b2b904752af18aaaf8084105226a1851" &gt;TransparentProxyInterceptor 可以拦截多个接口和按引用封送的对象上的公共实例方法。&lt;/span&gt; &lt;span id="xn72_709283cc17cd1c21f41c512a8703b827" &gt;这是最慢的拦截方式，但可以拦截的方法最多。&lt;/span&gt; &lt;span id="xn73_8e2bfa3ca68b8aab670c2432cc30d110" &gt;该拦截程序可以应用到新的和现有的实例。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn74_85a00836de41d203aa90005c7dca5366" &gt;VirtualMethodInterceptor 可以拦截公共和受保护的虚拟方法。&lt;/span&gt; &lt;span id="xn75_017cbbedb3e47e89a2a23edb7ffb0292" &gt;该拦截程序只能应用到新的实例。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn76_b7db75cfb8431f50f2a456f9dc1f6084" &gt;应该注意的是，实例拦截可以应用到任意公共的实例方法，但不能应用到构造函数。&lt;/span&gt; &lt;span id="xn77_d1fbb89d5510188e256207b9de3020f1" &gt;这在将拦截应用到现有实例时相当明显，&lt;/span&gt; &lt;span id="xn78_6aadfaea47b7f0ab58bfeb2c3dc6e8bb" &gt;而将拦截应用到新创建的实例时则不那么明显。&lt;/span&gt; &lt;span id="xn79_4691a76f630731f44687d07490970539" &gt;实例拦截的实现方式是构造函数在应用程序代码取回要处理的对象时已经执行。&lt;/span&gt; &lt;span id="xn80_f740086d2edbcca27df1868ddb8b3d9a" &gt;结果，任何可拦截操作都必须在创建实例之后。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn81_049b293ae4f5742a8ab0a5f7a96d5472" &gt;类型拦截使用动态代码生成来返回从原始类型继承的对象。&lt;/span&gt; &lt;span id="xn82_3f9357e268254924d93fb3d3c4a803a8" &gt;在这种情况下，任何公共和受保护的虚拟方法都被重写，以便支持拦截。&lt;/span&gt; &lt;span id="xn83_e8ed1b9daa0d85118e231ee66ffe0fa2" &gt;请考虑使用以下代码：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="24"&gt;&lt;code  jquery1321680854187="23"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;calculatorProxy&amp;nbsp;=&amp;nbsp;Intercept.NewInstance&amp;lt;Calculator&amp;gt;(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;VirtualMethodInterceptor(),&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;[]&amp;nbsp;{&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;LogBehavior()&amp;nbsp;});&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn85_bccbbbcd9b8b3b0b233959321b966900" &gt;Calculator 类如下所示：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre&gt;&lt;code  jquery1321680854187="25"&gt;&#xD;
          &lt;span id="xn86_0d7ba9f7c231dd99fd2148ba1e399207" &gt;public class Calculator {&#xD;
  public virtual Int32 Sum(Int32 x, Int32 y) {&#xD;
    return x + y;&#xD;
  }&#xD;
}&lt;/span&gt;&#xD;
        &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn87_15adcfd48c2317aefecb4046e8def59b" &gt;&lt;strong&gt;图 2&lt;/strong&gt; 显示了对 calculatorProxy 变量进行动态检查后得到的类型的实际名称。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;img alt="" src="http://i.msdn.microsoft.com/gg535676.Esposito_Figure2_hires(en-us,MSDN.10).jpg" /&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn88_0265e219bcbfd891254649ac31a06d79" &gt;图 2 &lt;strong&gt;类型拦截之后的实际类型&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn89_d1acddbd0fd25df6cf7e3af3c0d68ebc" &gt;另外还要注意实例拦截和类型拦截之间存在的其他显著区别，例如按照调用的对象拦截调用。&lt;/span&gt; &lt;span id="xn90_423ba33d49f903f1aa322f4473f10e70" &gt;使用类型拦截时，如果一个方法调用同一对象上的另一个方法，那么该自我调用就可以被拦截，因为拦截逻辑在同一个对象中。&lt;/span&gt; &lt;span id="xn91_002550d6fbd76cc138b07f1f8325d6e0" &gt;但是，对于实例拦截，则只有当调用通过代理进行时，才能发生拦截。&lt;/span&gt; &lt;span id="xn92_2c422eaecdef49866e7f7d9a40c7ef33" &gt;当然，自我调用不需要经过代理，因此不会发生拦截。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn93_ebf34347fa68fc404e4c424d9da21aa1" &gt;使用 IoC 容器&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn94_ff77e1e6a00e8844f973a3c13b9fbd7b" &gt;在上个月的示例中，我使用了 Unity 库的 IoC 容器来完成对象的创建。&lt;/span&gt; &lt;span id="xn95_24858e2df0f8e11f5e6806dba4b3831e" &gt;IoC 容器是围绕对象创建的一个额外层，可以增加应用程序的灵活性。&lt;/span&gt; &lt;span id="xn96_efe9170b61448f66a6303ca97b101c89" &gt;如果您将 IoC 框架与更多 AOP 功能相结合，就更是如此。&lt;/span&gt; &lt;span id="xn97_7a8d151b2eccabaf232780a9ea5b2f17" &gt;此外（我是这样认为的），如果您将 IoC 容器与离线配置结合使用，代码的灵活程度将超乎想象。&lt;/span&gt; &lt;span id="xn98_a4c0be3e77e36713c136ea787eb7effc" &gt;但是，下面这个示例将使用 Unity 的容器以及基于代码的 Fluent 配置：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="27"&gt;&lt;code  jquery1321680854187="26"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Configure&amp;nbsp;the&amp;nbsp;IoC&amp;nbsp;container&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;var&amp;nbsp;container&amp;nbsp;=&amp;nbsp;UnityStarter.Initialize();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Start&amp;nbsp;the&amp;nbsp;application&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;var&amp;nbsp;calculator&amp;nbsp;=&amp;nbsp;container.Resolve&amp;lt;ICalculator&amp;gt;();&lt;/li&gt;&lt;li&gt;var&amp;nbsp;result&amp;nbsp;=&amp;nbsp;calculator.Sum(&lt;span &gt;&lt;font color="#ff0000"&gt;2&lt;/font&gt;&lt;/span&gt;,&amp;nbsp;&lt;span &gt;&lt;font color="#ff0000"&gt;2&lt;/font&gt;&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn100_a1747779020d9d55e79fb06175053196" &gt;启动容器所需的代码可以隔离在不同的类中，并在应用程序启动时调用。&lt;/span&gt; &lt;span id="xn101_954bf60a494c72a91c503150b709434b" &gt;启动代码将指导容器如何围绕应用程序解析类型以及如何处理拦截。&lt;/span&gt; &lt;span id="xn102_be33ed8b39dc2d9d358ef58e6734d2e1" &gt;调用 Resolve 方法可以为您屏蔽拦截的所有细节。&lt;/span&gt; &lt;span id="xn103_0d5e0801b235750891d59510eb6e386b" &gt;&lt;strong&gt;图 3&lt;/strong&gt; 显示了启动代码可能的实现方式。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn104_249a4b28afbf6f596556f61d3fb32634" &gt;图 3 &lt;strong&gt;启动 Unity&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="29"&gt;&lt;code  jquery1321680854187="28"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;public&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;class&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;UnityStarter&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;public&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;static&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;UnityContainer&amp;nbsp;Initialize()&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;container&amp;nbsp;=&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;UnityContainer();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Enable&amp;nbsp;interception&amp;nbsp;in&amp;nbsp;the&amp;nbsp;current&amp;nbsp;container&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.AddNewExtension&amp;lt;Interception&amp;gt;();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Register&amp;nbsp;ICalculator&amp;nbsp;with&amp;nbsp;the&amp;nbsp;container&amp;nbsp;and&amp;nbsp;map&amp;nbsp;it&amp;nbsp;to&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;an&amp;nbsp;actual&amp;nbsp;type.&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;In&amp;nbsp;addition,&amp;nbsp;specify&amp;nbsp;interception&amp;nbsp;details.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;container.RegisterType&amp;lt;ICalculator,&amp;nbsp;Calculator&amp;gt;(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;Interceptor&amp;lt;VirtualMethodInterceptor&amp;gt;(),&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;InterceptionBehavior&amp;lt;LogBehavior&amp;gt;());&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;return&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;container;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn108_779481eef907931d99f43cf8974b61b9" &gt;比较有利的一点是这段代码可以移动到独立的程序集中，动态加载或更改。&lt;/span&gt; &lt;span id="xn109_189abe94eeec7feb351e74158e7ae922" &gt;更重要的是，您可以在一个位置配置 Unity。&lt;/span&gt; &lt;span id="xn110_2d47677978736f8ae2fe6286f54cf93c" &gt;如果您坚持使用 Intercept 类（其行为就像智能工厂，每次使用时都需要做准备），就无法做到这一点。&lt;/span&gt; &lt;span id="xn111_ce0fbbc6696f3674fba3acfcd23ec1ae" &gt;因此，如果您的应用程序需要 AOP，请务必通过 IoC 容器获得。&lt;/span&gt; &lt;span id="xn112_e8b0ec1b432e9f5f53933b0efd7f27ed" &gt;如果将配置的详细信息移到 app.config 文件（如果是 Web 应用程序则是 web.config）中，就可以用更灵活的方式实现相同的解决方案。&lt;/span&gt; &lt;span id="xn113_3672cd4e4f8bbe6d43a40ec5dbee7e49" &gt;在这种情况下，启动代码包含以下两行：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="31"&gt;&lt;code  jquery1321680854187="30"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;container&amp;nbsp;=&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;new&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;UnityContainer();&lt;/li&gt;&lt;li&gt;container.LoadConfiguration();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn115_6a076d314bd67ddbb6400bc9bfe752ba" &gt;&lt;strong&gt;图 4&lt;/strong&gt; 显示了配置文件中必须包含的脚本。&lt;/span&gt; &lt;span id="xn116_206eea436b3e422187deda0fc8f18a34" &gt;在这里，我为 ICalculator 类型注册了两种行为。&lt;/span&gt; &lt;span id="xn117_122a41f93ee73d3df47a6a6d20bc6be4" &gt;这表示对接口公共成员的所有调用都将由 LogBehavior 和 BinaryBehavior 进行预处理和后处理。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn118_c015dc2061e19c327c037500991075b8" &gt;图 4 &lt;strong&gt;通过配置添加拦截细节&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="33"&gt;&lt;code  jquery1321680854187="32"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;unity&amp;nbsp;xmlns=&lt;span &gt;&lt;font color="#008080"&gt;"http://schemas.microsoft.com/practices/2010/unity"&lt;/font&gt;&lt;/span&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;lt;assembly&amp;nbsp;name=&lt;span &gt;&lt;font color="#008080"&gt;"SimplestWithConfigIoC"&lt;/font&gt;&lt;/span&gt;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;namespace&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;name=&lt;span &gt;&lt;font color="#008080"&gt;"SimplestWithConfigIoC.Calc"&lt;/font&gt;&lt;/span&gt;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;namespace&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;name=&lt;span &gt;&lt;font color="#008080"&gt;"SimplestWithConfigIoC.Behaviors"&lt;/font&gt;&lt;/span&gt;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;lt;sectionExtension&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type="Microsoft.Practices.Unity.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterceptionExtension.Configuration.&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterceptionConfigurationExtension,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Microsoft.Practices.Unity.Interception.Configuration"&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;lt;container&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;extension&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"Interception"&lt;/font&gt;&lt;/span&gt;&amp;nbsp;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;register&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"ICalculator"&lt;/font&gt;&lt;/span&gt;&amp;nbsp;mapTo=&lt;span &gt;&lt;font color="#008080"&gt;"Calculator"&lt;/font&gt;&lt;/span&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;interceptor&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"InterfaceInterceptor"&lt;/font&gt;&lt;/span&gt;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;interceptionBehavior&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"LogBehavior"&lt;/font&gt;&lt;/span&gt;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;interceptionBehavior&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"BinaryBehavior"&lt;/font&gt;&lt;/span&gt;/&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/register&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;register&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"LogBehavior"&lt;/font&gt;&lt;/span&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/register&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;register&amp;nbsp;type=&lt;span &gt;&lt;font color="#008080"&gt;"BinaryBehavior"&lt;/font&gt;&lt;/span&gt;&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/register&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/container&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;/unity&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn122_f86fc0c74de6ab0ec889a98dc6245141" &gt;请注意，由于 LogBehavior 和 BinaryBehavior 是具体的类型，因此您实际上根本不需要注册它们。&lt;/span&gt; &lt;span id="xn123_39d892073c4b64be963d06b1576b351f" &gt;Unity 的默认设置会自动处理它们。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span id="xn124_13e31bc1dfbb5331b1a61e47771d7eed" &gt;行为&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn125_0498eaf205b41353800302dfa0a9cb90" &gt;在 Unity 中，行为是真正实现横切关注点的对象。&lt;/span&gt; &lt;span id="xn126_f9d40db13eade0648e3995c7aa830db1" &gt;作为实现 IInterceptionBehavior 接口的类，行为将覆盖被拦截方法的执行循环，并且可以修改方法参数或返回值。&lt;/span&gt; &lt;span id="xn127_ae83246c30e2524eb43fada2037c78fc" &gt;行为甚至可以完全阻止方法被调用，或者多次调用方法。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn128_df2fb501072e218e73f4ae3763fe3940" &gt;一个行为由三个方法组成。&lt;/span&gt; &lt;span id="xn129_b3ccbecc6bb36d4aadcca999f20bde1b" &gt;&lt;strong&gt;图 5&lt;/strong&gt; 显示了一个拦截方法 Sum 并将返回值修改为二进制字符串的示例行为。&lt;/span&gt; &lt;span id="xn130_d76479a45fc8c90b15d12a0ecd0f9fd0" &gt;方法 WillExecute 只是一种优化代理的方式。&lt;/span&gt; &lt;span id="xn131_d98ec1f888f02900ac1f46d7e5b42a23" &gt;如果它返回 False，行为就不会执行。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn132_fdc5c1159d7b4e321cc4b0ec1b67cd56" &gt;图 5 &lt;strong&gt;行为示例&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="35"&gt;&lt;code  jquery1321680854187="34"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;public&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;class&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;BinaryBehavior&amp;nbsp;:&amp;nbsp;IInterceptionBehavior&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;public&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;Type&amp;gt;&amp;nbsp;GetRequiredInterfaces()&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;return&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;Type.EmptyTypes;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;public&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;bool&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;WillExecute&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&amp;nbsp;{&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;return&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;true&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;public&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;IMethodReturn&amp;nbsp;Invoke(&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IMethodInvocation&amp;nbsp;input,&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetNextInterceptionBehaviorDelegate&amp;nbsp;getNext)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Perform&amp;nbsp;the&amp;nbsp;operation&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;methodReturn&amp;nbsp;=&amp;nbsp;getNext().Invoke(input,&amp;nbsp;getNext);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Grab&amp;nbsp;the&amp;nbsp;output&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;result&amp;nbsp;=&amp;nbsp;methodReturn.ReturnValue;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;Transform&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;binaryString&amp;nbsp;=&amp;nbsp;((Int32)result).ToBinaryString();&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;font color="#008000"&gt;//&amp;nbsp;For&amp;nbsp;example,&amp;nbsp;write&amp;nbsp;it&amp;nbsp;out&lt;/font&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span &gt;&lt;font color="#008080"&gt;"Rendering&amp;nbsp;{0}&amp;nbsp;as&amp;nbsp;binary&amp;nbsp;=&amp;nbsp;{1}"&lt;/font&gt;&lt;/span&gt;,&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result,&amp;nbsp;binaryString);&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;return&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&amp;nbsp;methodReturn;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn134_3cb67662ec5bce068194bb5520620d56" &gt;这其实有点微妙。&lt;/span&gt; &lt;span id="xn135_4119821fa07bb2d6a7298d0311c54c1e" &gt;Invoke 总是被调用，因此即使返回 False，您的行为实际上也会执行。&lt;/span&gt; &lt;span id="xn136_ef2a2cce7e0ba10bbfefb23ebc3a40d2" &gt;但是在创建代理或派生类型时，如果为该类型注册的所有行为都将 WillExecute 设置为 False，那么也就不会创建代理本身，您将再次处理原始对象。&lt;/span&gt; &lt;span id="xn137_9c262dd3f73e59d26669a0248d025c19" &gt;这实际上是在优化代理创建。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn138_92ca8e491be420bcaa55ab1689b51588" &gt;GetRequiredInterfaces 方法允许行为向目标对象添加新接口，从此方法返回的接口将添加到代理中。&lt;/span&gt; &lt;span id="xn139_51b751c77a762d8c6fed8eecad221405" &gt;因此，行为的核心就是 Invoke 方法。&lt;/span&gt; &lt;span id="xn140_0ed0a2389f712a1a55a01d0c84348120" &gt;该参数输入让您可以访问目标对象上正在调用的方法。&lt;/span&gt; &lt;span id="xn141_7c13ca089597a0237ff2f3b6d8a76cf0" &gt;参数 getNext 是一个委托，用于移动到管道中下一个行为，并且最终执行目标上的方法。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn142_f56ef0d7f3c12b2bc981e3d1c6c50924" &gt;Invoke 方法确定调用目标对象上的公共方法时所用的实际逻辑。&lt;/span&gt; &lt;span id="xn143_94260ee37c011615ad7fc929f7971767" &gt;请注意，目标对象上所有被拦截的方法都将按照 Invoke 中表达的逻辑执行。&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span id="xn144_23ddd2fd05985fb707fd1c7acdc83d46" &gt;如果要使用更特殊的匹配规则，该怎么办呢？&lt;/span&gt; &lt;span id="xn145_11b1be5e3241f90a26896c30de514538" &gt;使用我在本文中介绍的普通拦截，您能做的就是运行一组 IF 语句，来找出被调用的是哪个方法，如下所示：&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre jquery1321680854187="37"&gt;&lt;code  jquery1321680854187="36"&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span &gt;&lt;strong&gt;&lt;font color="#000080"&gt;if&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;(input.MethodBase.Name&amp;nbsp;==&amp;nbsp;&lt;span &gt;&lt;font color="#008080"&gt;"Sum"&lt;/font&gt;&lt;/span&gt;)&amp;nbsp;{&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;...&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span id="xn148_1656c314038398d062f8ee3f46f5b2ff" &gt;下个月我将继续这个话题，探讨以更有效的方式应用拦截，为被拦截的方法定义匹配规则。&lt;/span&gt; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/umlchina/aggbug/2255136.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2011/11/19/2255136.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2011/11/19/InterceptionandInterceptors.html</id><title type="text">Interception and Interceptors in C# (Aspect oriented programming) 转载</title><summary type="text">Interception and Interceptors in C# (Aspect oriented programming)by Ioannis 16. January 2011 10:38 In this post, we see how to define specific actions to be executed before or after the execution of every call to a method in our code. This is also known as “intercepting” the execution of a method an</summary><published>2011-11-19T04:27:00Z</published><updated>2011-11-19T04:27:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2011/11/19/InterceptionandInterceptors.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2011/11/19/InterceptionandInterceptors.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;a  href="http://www.cnblogs.com/Blog/post/Interception-and-Interceptors-in-C-(Aspect-oriented-programming).aspx"&gt;Interception and Interceptors in C# (Aspect oriented programming)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;span &gt;by &lt;a href="http://www.cnblogs.com/Blog/author/Admin.aspx"&gt;Ioannis&lt;/a&gt;&lt;/span&gt; &lt;span &gt;16. January 2011 10:38&lt;/span&gt; &#xD;
&lt;div &gt;&#xD;
&lt;p&gt;In this post, we see how to define specific actions to be executed before or after the execution of &lt;strong&gt;every&lt;/strong&gt; call to a method in our code. This is also known as &amp;#8220;&lt;em&gt;intercepting&lt;/em&gt;&amp;#8221; the execution of a method and is related to AOP (Aspect Oriented Programming). We will explore two different ways of achieving this:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;Using Microsoft&amp;#8217;s Unity framework&lt;/li&gt;&lt;li&gt;Using the PostSharp library&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.castleproject.org/dynamicproxy/index.html" target="_blank"&gt;CastleDynamicProxy&lt;/a&gt; is another library allowing you to intercept methods and resembles a lot to the Unity framework&amp;#8217;s approach so it will not be described here. You can also use .NET framewrok&amp;#8217;s &lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx" target="_blank"&gt;Emit namespace&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx" target="_blank"&gt;CodeDom&lt;/a&gt; to create your intercepting Proxy objects from scratch but this approach is out of the scope of this post.&lt;/p&gt;&#xD;
&lt;p&gt;Aspect Oriented Programming deals with horizontal concerns in the specifications of your programs. Horizontal concerns are requirements that span through every business logic or specific behavior of your system. Take for example the following figure displaying some typical modules of an e-shop application.&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://www.progware.org/Blog/image.axd?picture=image_6.png"&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="Specifications" border="0" alt="Horizontal and Vertical Concerns" src="http://www.progware.org/Blog/image.axd?picture=image_thumb_6.png" width="530" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The classes of the system that deal with the system&amp;#8217;s business logic (charging, product browsing etc), in a good design, do not replicate logic within each other. Those are &amp;#8220;Vertical concerns&amp;#8221; since they can be considered unrelated. On the contrary, if we want to provide logging for every method in our classes or want to apply security checks we deal with &amp;#8220;Horizontal concerns&amp;#8221; since they span throughout all the modules of the system.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Now, if you imagine implementing the &amp;#8220;typical&amp;#8221; way those concerns (eg the logging mechanism), you will end up decorating a lot of your &amp;#8220;Vertical concern classes&amp;#8221; with code like the following:&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;a href="http://www.progware.org/Blog/image.axd?picture=image_7.png"&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" border="0" alt="image" src="http://www.progware.org/Blog/image.axd?picture=image_thumb_7.png" width="603" height="172" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Not very pretty especially if you image replicating this in every class of every &amp;#8220;Vertical concern&amp;#8221;. This is where Aspect Oriented Programming comes in handy by providing a way of turning those horizontal concerns into &amp;#8220;Aspects&amp;#8221; which practically means that you find a way of intercepting the execution of those methods adding the extra logic in a single place and thus perform your required actions with as few changes as possible to the initial code.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Microsoft&amp;#8217;s Unity Framework&lt;/u&gt;&lt;/strong&gt; (&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=bcb166f7-dd16-448b-a152-9845760d9b4c&amp;amp;displaylang=en" target="_blank"&gt;link&lt;/a&gt;)&lt;/p&gt;&#xD;
&lt;p&gt;Microsoft&amp;#8217;s Unity 2.0 comes within Enterprise Library. It is easy to use with the limitation that you need to have all your objects to intercept created through a factory within your code and also the interceptable classes need to implement an Interface or derive from the MarshalByRefObject class.&lt;/p&gt;&#xD;
&lt;p&gt;So lets suppose you have the following class:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ClassToIntercept&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ID { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetRandomNumber(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; min, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; max) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Random().Next(min,max);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;In your code all objects of this class are instantiated with &amp;#8220;new ClassToIntercept()&amp;#8221;. &lt;strong&gt;&lt;u&gt;&lt;em&gt;You have no way to intercept this&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt; with the Unity Framework without changing anything in the class or the object creation places. On the contrary if you have built factories for your classes (that is you never create objects with the new keyword but rather ask a method to create them for you &amp;#8211; not a bad programming practice for many reasons) such as:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&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; ClassToInterceptFactory&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ClassToIntercept GetClassToIntercept()&lt;br /&gt;    {&lt;br /&gt;        ClassToIntercept ReturnClass = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassToIntercept();&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ReturnClass;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;Now whenever you need a ClassToIntercept object in your code you call the GetClassToIntercept method. Unfortunately, you still cannot intercept the class methods. Your class also needs to derive from MarshalByRef object:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ClassToIntercept:MarshalByRefObject&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ID { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetRandomNumber(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; min, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; max) {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Random().Next(min,max);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;And now you can change your factory as follows:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ClassToIntercept GetClassToIntercept()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000"&gt;//ClassToIntercept ReturnClass = new ClassToIntercept();&lt;/span&gt;&lt;br /&gt;    ClassToIntercept ReturnClass = Intercept.ThroughProxy(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassToIntercept(), &lt;br /&gt;                                              &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; TransparentProxyInterceptor(), &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InterceptionClass() });&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ReturnClass;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;Interception will work and what will happen will be determined from the InterceptionClass that will be explained in a minute.&lt;/p&gt;&#xD;
&lt;p&gt;If you wanted to avoid deriving from MarshalByRef you could have implemented an interface for your initial class such as:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; IClassToIntercept&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetRandomNumber(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; min, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; max);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;Have your class implement this interface and your factory return the Interface instead of the class. This would mean that you program your whole software to the Interface and not to the actual class (which is not a bad programming practice either although it cannot be applied easily to any scenario). Nevertheless, if this is the case, then your factory would now be like the following:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IClassToIntercept GetClassToInterceptInterface()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000"&gt;//IClassToIntercept ReturnClass = new ClassToIntercept();&lt;/span&gt;&lt;br /&gt;    IClassToIntercept ReturnClass = Intercept.ThroughProxy&amp;lt;IClassToIntercept&amp;gt;(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ClassToIntercept(), &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InterfaceInterceptor(),&lt;br /&gt;                                             &lt;span style="color: #0000ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; InterceptionClass() });&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ReturnClass;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;For all those to work you need to have the Enterprise Library installed and&amp;nbsp; add as References Microsoft.Practices.Unity and Microsoft.Practices.Unity.Interceptions. The Interception class is as follows (the Invoke method is the one doing the job!):&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.51%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; height: 220px; 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;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; InterceptionClass:IInterceptionBehavior&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Type&amp;gt; GetRequiredInterfaces() {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; Type.EmptyTypes;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; IMethodReturn Invoke(IMethodInvocation input,GetNextInterceptionBehaviorDelegate getNext){&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;"Before the method"&lt;/span&gt;);&lt;br /&gt;        var methodReturn = getNext().Invoke(input, getNext);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (methodReturn.Exception == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #006080"&gt;"After the method"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;br /&gt;            Console.WriteLine(&lt;span style="color: #006080"&gt;"Ater the method with exception"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; methodReturn;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; WillExecute {&lt;br /&gt;        get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;References&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/gg490353.aspx" target="_blank"&gt;Aspect-Oriented Programming, Interception and Unity 2.0 (Dino Esposito)&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/gg535676.aspx" target="_blank"&gt;Interceptors in Unity (Dino Esposito)&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Using PostSharp&lt;/u&gt;&lt;/strong&gt;(&lt;a href="http://www.sharpcrafters.com/postsharp/documentation/getting-started" target="_blank"&gt;link&lt;/a&gt;)&lt;/p&gt;&#xD;
&lt;p&gt;PostSharp is a great tool and can achieve the most clean interception possible (meaning no changes in your classes and object generation at all even if you do not your factories for object creation and/or interfaces) but it is not a free library. Rather than creating proxies at runtime, it injects code at compile time and therefore changes your initial program in a seamless way to add method interception.&lt;/p&gt;&#xD;
&lt;p&gt;To achieve the same result you include PostsSharp.dll in your project and then create an attribute such as:&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[Serializable]&lt;br /&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; TraceAttribute : OnMethodBoundaryAspect&lt;br /&gt;{&lt;br /&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;void&lt;/span&gt; OnEntry(MethodExecutionArgs args)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;"Before the method"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&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;void&lt;/span&gt; OnExit(MethodExecutionArgs args)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span style="color: #006080"&gt;"After the method"&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;Now you can add the following attribute making all methods of ClassToIntercept Intereptable (you can also apply the Trace attribute to classes/methods if you can change the original code):&lt;/p&gt;&#xD;
&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;&lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;[assembly: Trace(AttributeTargetTypes = &lt;span style="color: #006080"&gt;"Interceptions.ClassToIntercept"&lt;/span&gt;)]&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;The cool thing in this is that you do not change anything else in your code, so your object can be still generated using the new keyword.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:01665cde-2eb8-4ee6-94a6-11922336706e" &gt;&#xD;
&lt;p&gt;In this post, I have demonstrated two very easy approached in providing method interceptors n your programs. The complete demo project can be downloaded &lt;a href="http://www.progware.org/Blog/file.axd?file=Interceptions.rar" target="_blank"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/umlchina/aggbug/2255078.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2011/11/19/InterceptionandInterceptors.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2010/08/27/1809830.html</id><title type="text">WPF Snippet Tutorial - Aligning ListView Items</title><summary type="text">WPF is powerful. So powerful in fact, that sometimes it's hard to find styles and settings to make it do what you want. Aligning ListView items was one such example for me. This snippet tutorial will ...</summary><published>2010-08-27T02:01:00Z</published><updated>2010-08-27T02:01:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2010/08/27/1809830.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2010/08/27/1809830.html"/><content type="html">&lt;p&gt;WPF is powerful. So powerful in fact, that sometimes it's hard to find styles and settings to make it do what you want. Aligning ListView items was one such example for me. This snippet tutorial will show you how to use a style to vertically and horizontally align the contents of ListView cells. &lt;p&gt;I came across the need to vertically align the contents of my ListView when I had columns that contained elements that were different heights. By default, the ListView vertically aligns all of the content to the middle. I wanted them aligned to the top. &lt;p&gt;Here's a quick application I threw together to demonstrate what I'm talking about. It has a ListView bound to a collection of VideoGame objects. Each video game contains the title and an image of the box art. First, the object and some code to populate it: &lt;p&gt;public class VideoGame&lt;br&gt;{&lt;br&gt;public string Name&lt;br&gt;{&lt;br&gt;get;&lt;br&gt;set;&lt;br&gt;}&lt;br&gt;public string Image&lt;br&gt;{&lt;br&gt;get;&lt;br&gt;set;&lt;br&gt;}&lt;br&gt;} &lt;p&gt;... &lt;p&gt;public partial class Window1 : Window&lt;br&gt;{&lt;br&gt;private ObservableCollection&amp;lt;VideoGame&amp;gt; _games =&lt;br&gt;new ObservableCollection&amp;lt;VideoGame&amp;gt;();&lt;br&gt;public ObservableCollection&amp;lt;VideoGame&amp;gt; Games&lt;br&gt;{&lt;br&gt;get { return _games; }&lt;br&gt;}&lt;br&gt;public Window1()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _games.Add(new VideoGame() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = "Crysis", &lt;br&gt;Image = @"C:\Crysis_Boxart_Final.jpg" });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _games.Add(new VideoGame() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = "Unreal Tournament 3", &lt;br&gt;Image = @"C:\Gearsofwar.JPG" });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _games.Add(new VideoGame() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = "Gears of War", &lt;br&gt;Image = @"C:\Crysis_Boxart_Final.jpg" });&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br&gt;}&lt;br&gt;} &lt;p&gt;And here's the XAML that displays this information: &lt;p&gt;&amp;lt;Window x:Class="VerticalAlignSnippet.Window1"&lt;br&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br&gt;Title="Window1" Height="512" Width="512" Name="myWindow"&amp;gt;&lt;br&gt;&amp;lt;Grid&amp;gt;&lt;br&gt;&amp;lt;ListView Name="myListView"&lt;br&gt;ItemsSource="{Binding ElementName=myWindow, Path=Games}"&amp;gt;&lt;br&gt;&amp;lt;ListView.View&amp;gt;&lt;br&gt;&amp;lt;GridView&amp;gt;&lt;br&gt;&amp;lt;GridViewColumn Header="Title" DisplayMemberBinding="{Binding Name}" /&amp;gt;&lt;br&gt;&amp;lt;GridViewColumn Header="Image"&amp;gt;&lt;br&gt;&amp;lt;GridViewColumn.CellTemplate&amp;gt;&lt;br&gt;&amp;lt;DataTemplate&amp;gt;&lt;br&gt;&amp;lt;Grid&amp;gt;&lt;br&gt;&amp;lt;Image Source="{Binding Image}" /&amp;gt;&lt;br&gt;&amp;lt;/Grid&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt;&lt;br&gt;&amp;lt;/GridViewColumn.CellTemplate&amp;gt;&lt;br&gt;&amp;lt;/GridViewColumn&amp;gt;&lt;br&gt;&amp;lt;/GridView&amp;gt;&lt;br&gt;&amp;lt;/ListView.View&amp;gt;&lt;br&gt;&amp;lt;/ListView&amp;gt;&lt;br&gt;&amp;lt;/Grid&amp;gt;&lt;br&gt;&amp;lt;/Window&amp;gt; &lt;p&gt;When you launch this application, you'll get something that looks like this: &lt;p&gt;&lt;img alt="Unaligned Items Screenshot" src="http://www.switchonthecode.com/sites/default/files/222/images/unaligned_screenshot.jpg"&gt; &lt;p&gt;As you can see, each title is centered vertically to the image. I want to align it to the top. Here's the style needed to accomplish this: &lt;p&gt;&amp;lt;ListView.ItemContainerStyle&amp;gt;&lt;br&gt;&amp;lt;Style TargetType="ListViewItem"&amp;gt;&lt;br&gt;&amp;lt;Setter Property="VerticalContentAlignment" Value="Top" /&amp;gt;&lt;br&gt;&amp;lt;/Style&amp;gt;&lt;br&gt;&amp;lt;/ListView.ItemContainerStyle&amp;gt; &lt;p&gt;Now if we slap that into our ListView, we'll get exactly what we're looking for: &lt;p&gt;&amp;lt;Window x:Class="VerticalAlignSnippet.Window1"&lt;br&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br&gt;Title="Window1" Height="512" Width="512" Name="myWindow"&amp;gt;&lt;br&gt;&amp;lt;Grid&amp;gt;&lt;br&gt;&amp;lt;ListView Name="myListView"&lt;br&gt;ItemsSource="{Binding ElementName=myWindow, Path=Games}"&amp;gt;&lt;br&gt;&amp;lt;ListView.ItemContainerStyle&amp;gt;&lt;br&gt;&amp;lt;Style TargetType="ListViewItem"&amp;gt;&lt;br&gt;&amp;lt;Setter Property="VerticalContentAlignment" Value="Top" /&amp;gt;&lt;br&gt;&amp;lt;/Style&amp;gt;&lt;br&gt;&amp;lt;/ListView.ItemContainerStyle&amp;gt;&lt;br&gt;&amp;lt;ListView.View&amp;gt;&lt;br&gt;&amp;lt;GridView&amp;gt;&lt;br&gt;&amp;lt;GridViewColumn Header="Title" DisplayMemberBinding="{Binding Name}" /&amp;gt;&lt;br&gt;&amp;lt;GridViewColumn Header="Image"&amp;gt;&lt;br&gt;&amp;lt;GridViewColumn.CellTemplate&amp;gt;&lt;br&gt;&amp;lt;DataTemplate&amp;gt;&lt;br&gt;&amp;lt;Grid&amp;gt;&lt;br&gt;&amp;lt;Image Source="{Binding Image}" /&amp;gt;&lt;br&gt;&amp;lt;/Grid&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt;&lt;br&gt;&amp;lt;/GridViewColumn.CellTemplate&amp;gt;&lt;br&gt;&amp;lt;/GridViewColumn&amp;gt;&lt;br&gt;&amp;lt;/GridView&amp;gt;&lt;br&gt;&amp;lt;/ListView.View&amp;gt;&lt;br&gt;&amp;lt;/ListView&amp;gt;&lt;br&gt;&amp;lt;/Grid&amp;gt;&lt;br&gt;&amp;lt;/Window&amp;gt; &lt;p&gt;&lt;img alt="Aligned Top Items Screenshot" src="http://www.switchonthecode.com/sites/default/files/222/images/align_top_screenshot.jpg"&gt; &lt;p&gt;We can also use this style to horizontally align the content. Let's say I wanted to align all of the titles to the right as well as the top. All we'd have to do is change our style to this: &lt;p&gt;&amp;lt;ListView.ItemContainerStyle&amp;gt;&lt;br&gt;&amp;lt;Style TargetType="ListViewItem"&amp;gt;&lt;br&gt;&amp;lt;Setter Property="VerticalContentAlignment" Value="Top" /&amp;gt;&lt;br&gt;&amp;lt;Setter Property="HorizontalContentAlignment" Value="Right" /&amp;gt;&lt;br&gt;&amp;lt;/Style&amp;gt;&lt;br&gt;&amp;lt;/ListView.ItemContainerStyle&amp;gt; &lt;p&gt;&lt;img alt="Aligned Top Right Items Screenshot" src="http://www.switchonthecode.com/sites/default/files/222/images/align_top_right_screenshot.jpg"&gt;&lt;img src="http://www.cnblogs.com/umlchina/aggbug/1809830.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2010/08/27/1809830.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2010/08/26/1809395.html</id><title type="text">WPF Tutorial - How To Use A DataTemplateSelector</title><summary type="text">DataTemplates are an extremely powerful part of WPF, and by using them, you can abstract all sorts of display code. However, there are times when they fall short - and initially when I was learning WP...</summary><published>2010-08-26T10:30:00Z</published><updated>2010-08-26T10:30:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809395.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809395.html"/><content type="html">&lt;p&gt;DataTemplates are an extremely powerful part of WPF, and by using them, you can abstract all sorts of display code. However, there are times when they fall short - and initially when I was learning WPF I was disappointed by that. For instance, you only get to set one DataTemplate on an items control, and while that made sense, it felt limiting. What if I wanted to use different templates depending on the content of the item? Do I have to build all that logic into a single data template? &lt;p&gt;And then I discovered DataTemplateSelectors! They are WPF's answer to the question I posed above - they let you write some logic that chooses what data template to use for an item. You could even, say, create an entirely new data template on the fly if you needed to. And it helps with one of WPF's main goals, separating out display (the DataTemplate itself) from logic (the DataTemplateSelector). &lt;p&gt;We are going to write a simple little application today, that is essentially just a list view containing a collection of strings. However, there is a twist - if the string is a path to an image on disk, instead of displaying the string, the list view will display the image. You can see a screenshot of it in action below: &lt;p&gt;&lt;img alt="App Screenshot" src="http://www.switchonthecode.com/sites/default/files/219/images/DTSEShot.png"&gt; &lt;p&gt;Time to dive into some code. First, lets write the two DataTemplates we need - one displaying the image, and one for displaying the string: &lt;p&gt;&amp;lt;DataTemplate x:Key="stringTemplate"&amp;gt;&lt;br&gt;&amp;lt;TextBlock Text="{Binding}"/&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt;&lt;br&gt;&amp;lt;DataTemplate x:Key="imageTemplate"&amp;gt;&lt;br&gt;&amp;lt;Image Source="{Binding Converter={StaticResource relToAbsPathConverter}}"&lt;br&gt;Stretch="UniformToFill" Width="200"/&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt; &lt;p&gt;Simple enough stuff. For when we just want to display the string, we use a &lt;code&gt;TextBlock&lt;/code&gt; and bind the &lt;code&gt;Text&lt;/code&gt; to the current item. When that string is an image path, however, we will be using an &lt;code&gt;Image&lt;/code&gt; and binding the &lt;code&gt;Source&lt;/code&gt; property to the string. The only quirk here is how the source property gets interpreted. If the path is relative, the &lt;code&gt;Source&lt;/code&gt; property will think it is a reference to an internal program resource, and not a file on disk. So we have a converter that takes the relative path string and converts it to an absolute path string. You can learn more about binding converters &lt;a href="http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters"&gt;here&lt;/a&gt;, in a tutorial that The Reddest wrote just the other day. &lt;p&gt;Since I was just talking about the converter, might as well get the code for it out of the way: &lt;p&gt;public class RelativeToAbsolutePathConverter : IValueConverter&lt;br&gt;{&lt;br&gt;public object Convert(object value, Type targetType,&lt;br&gt;object parameter, CultureInfo culture)&lt;br&gt;{&lt;br&gt;String relative = value as string;&lt;br&gt;if (relative == null)&lt;br&gt;return null;&lt;br&gt;return System.IO.Path.GetFullPath(relative);&lt;br&gt;}&lt;br&gt;public object ConvertBack(object value, Type targetType,&lt;br&gt;object parameter, CultureInfo culture)&lt;br&gt;{&lt;br&gt;throw new NotImplementedException();&lt;br&gt;}&lt;br&gt;} &lt;p&gt;All we do is cast the value to a string, and then use the handy &lt;code&gt;GetFullPath&lt;/code&gt; method to get the full path for the given relative path. Since we don't need to use the &lt;code&gt;ConvertBack&lt;/code&gt; method, I just have it set to throw a &lt;code&gt;NotImplementedException&lt;/code&gt;. &lt;p&gt;Now that we have our Data Templates, lets write the &lt;code&gt;DataTemplateSelector&lt;/code&gt;: &lt;p&gt;public class ImgStringTemplateSelector : DataTemplateSelector&lt;br&gt;{&lt;br&gt;public DataTemplate ImageTemplate { get; set; }&lt;br&gt;public DataTemplate StringTemplate { get; set; }&lt;br&gt;public override DataTemplate SelectTemplate(object item, &lt;br&gt;DependencyObject container)&lt;br&gt;{&lt;br&gt;String path = (string)item;&lt;br&gt;String ext = System.IO.Path.GetExtension(path);&lt;br&gt;if (System.IO.File.Exists(path) &amp;amp;&amp;amp; ext == ".jpg")&lt;br&gt;return ImageTemplate;&lt;br&gt;return StringTemplate;&lt;br&gt;}&lt;br&gt;} &lt;p&gt;As you can see, to make your own &lt;code&gt;DataTemplateSelector&lt;/code&gt; you create a class that extends the class &lt;code&gt;DataTemplateSelector&lt;/code&gt;. This class has a single method that we need to override - &lt;code&gt;SelectTemplate&lt;/code&gt;. This method will get called and get passed an item, and it needs to return what &lt;code&gt;DataTemplate&lt;/code&gt; to use for that item. Here, we expect the item to be a string - and if the string represents a file path, and the file exists, and the extension is ".jpg", we return the template we are using for images, otherwise we return the template we are using for strings. &lt;p&gt;You are probably wondering, however, where the properties &lt;code&gt;ImageTemplate&lt;/code&gt; and &lt;code&gt;StringTemplate&lt;/code&gt; actually get set to the Data Templates we created earlier. Well, this happens in the xaml when we create an instance of the &lt;code&gt;ImgStringTemplateSelector&lt;/code&gt;: &lt;p&gt;&amp;lt;local:ImgStringTemplateSelector&lt;br&gt;ImageTemplate="{StaticResource imageTemplate}"&lt;br&gt;StringTemplate="{StaticResource stringTemplate}"&lt;br&gt;x:Key="imgStringTemplateSelector" /&amp;gt; &lt;p&gt;Ok, now it is time to throw all of the xaml out there so that you can see how the ListView actually uses the &lt;code&gt;ImgStringTemplateSelector&lt;/code&gt; we just created: &lt;p&gt;&amp;lt;Window x:Class="DataTemplateSelectorExample.Window1"&lt;br&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br&gt;xmlns:local="clr-namespace:DataTemplateSelectorExample"&lt;br&gt;Title="Data Template Selector Example"&lt;br&gt;Height="300" Width="300" Name="This"&amp;gt;&lt;br&gt;&amp;lt;Window.Resources&amp;gt;&lt;br&gt;&amp;lt;local:RelativeToAbsolutePathConverter x:Key="relToAbsPathConverter" /&amp;gt;&lt;br&gt;&amp;lt;DataTemplate x:Key="stringTemplate"&amp;gt;&lt;br&gt;&amp;lt;TextBlock Text="{Binding}"/&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt;&lt;br&gt;&amp;lt;DataTemplate x:Key="imageTemplate"&amp;gt;&lt;br&gt;&amp;lt;Image Source="{Binding Converter={StaticResource relToAbsPathConverter}}"&lt;br&gt;Stretch="UniformToFill" Width="200"/&amp;gt;&lt;br&gt;&amp;lt;/DataTemplate&amp;gt;&lt;br&gt;&amp;lt;local:ImgStringTemplateSelector&lt;br&gt;ImageTemplate="{StaticResource imageTemplate}"&lt;br&gt;StringTemplate="{StaticResource stringTemplate}"&lt;br&gt;x:Key="imgStringTemplateSelector" /&amp;gt;&lt;br&gt;&amp;lt;/Window.Resources&amp;gt;&lt;br&gt;&amp;lt;Grid&amp;gt;&lt;br&gt;&amp;lt;ListView ScrollViewer.CanContentScroll="False"&lt;br&gt;ItemsSource="{Binding ElementName=This, Path=PathCollection}"&lt;br&gt;ItemTemplateSelector="{StaticResource imgStringTemplateSelector}"&amp;gt;&lt;br&gt;&amp;lt;/ListView&amp;gt;&lt;br&gt;&amp;lt;/Grid&amp;gt;&lt;br&gt;&amp;lt;/Window&amp;gt; &lt;p&gt;The templates and the selector are all resources in the current window. This makes it so that when we get down to creating the &lt;code&gt;ListView&lt;/code&gt;, we can set the &lt;code&gt;ItemTemplateSelector&lt;/code&gt; to the static resource &lt;code&gt;imgStringTemplateSelector&lt;/code&gt;. We also set the &lt;code&gt;ItemsSource&lt;/code&gt; - we bind it to the &lt;code&gt;PathCollection&lt;/code&gt; on the element &lt;code&gt;This&lt;/code&gt;. What is the element &lt;code&gt;This&lt;/code&gt;? Well, it happens to be the name of the window - you can see it up in the &lt;code&gt;Name&lt;/code&gt;property of the &lt;code&gt;Window&lt;/code&gt; tag. And the &lt;code&gt;PathCollection&lt;/code&gt; is a property on &lt;code&gt;Window1&lt;/code&gt;: &lt;p&gt;public partial class Window1 : Window&lt;br&gt;{&lt;br&gt;ObservableCollection&amp;lt;string&amp;gt; _PathCollection = new ObservableCollection&amp;lt;string&amp;gt;();&lt;br&gt;public Window1()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PathCollection.Add("Sunset.jpg");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PathCollection.Add("I'm not an image");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PathCollection.Add("Blue hills.jpg");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PathCollection.Add("Water lilies.jpg");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PathCollection.Add("More string action");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _PathCollection.Add("Winter.jpg");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br&gt;}&lt;br&gt;public ObservableCollection&amp;lt;string&amp;gt; PathCollection&lt;br&gt;{ get { return _PathCollection; } }&lt;br&gt;} &lt;p&gt;The only other thing of note is the fact that &lt;code&gt;ScrollViewer.CanContentScroll&lt;/code&gt; is set to false on the &lt;code&gt;ListView&lt;/code&gt;. This is just there to enable smooth scrolling on the list box - it doesn't try and scroll the items one at a time, it lets you scroll partially through an item. It is just a nicety because the &lt;code&gt;ListView&lt;/code&gt; will contain images. &lt;p&gt;Well, that is it for this introduction to the &lt;code&gt;DataTemplateSelector&lt;/code&gt;. You can grab the Visual Studio project for what we wrote today &lt;a href="http://www.switchonthecode.com/sites/default/files/219/source/SOTC-DataTemplateSelectorExample.zip"&gt;here&lt;/a&gt;. And, as always, leave any questions or comments below. &lt;img src="http://www.cnblogs.com/umlchina/aggbug/1809395.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809395.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2010/08/26/1809264.html</id><title type="text">Dependency Properties</title><summary type="text">Dependency Properties Introduction Value resolution strategy The magic behind it How to create a DepdencyProperty Readonly DependencyProperties Attached DependencyProperties Listen to dependency prope...</summary><published>2010-08-26T09:03:00Z</published><updated>2010-08-26T09:03:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809264.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809264.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Dependency Properties&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#introduction"&gt;Introduction&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#valueres"&gt;Value resolution strategy&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#howitworks"&gt;The magic behind it&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#creation"&gt;How to create a DepdencyProperty&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#readonly"&gt;Readonly DependencyProperties&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#attached"&gt;Attached DependencyProperties&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#changes"&gt;Listen to dependency property changes&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.wpftutorial.net/DependencyProperties.html#clear"&gt;How to clear a local value&lt;/a&gt; &lt;p&gt;&lt;a name="introduction"&gt; &lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt; &lt;p&gt;When you begin to develop appliations with WPF, you will soon stumble across DependencyProperties. They look quite similar to normal .NET properties, but the concept behind is much more complex and powerful. &lt;p&gt;The main difference is, that the value of a normal .NET property is &lt;b&gt;read directly&lt;/b&gt; from a private member in your class, whereas the value of a DependencyProperty is &lt;b&gt;resolved dynamically&lt;/b&gt; when calling the &lt;code&gt;GetValue()&lt;/code&gt; method that is inherited from DependencyObject. &lt;p&gt;When you set a value of a dependency property it is &lt;b&gt;not stored in a field&lt;/b&gt; of your object, &lt;b&gt;but in a dictionary&lt;/b&gt; of keys and values provided by the base class &lt;code&gt;DependencyObject&lt;/code&gt;. The key of an entry is the name of the property and the value is the value you want to set. &lt;p&gt;The advantages of dependency properties are &lt;ul&gt; &lt;li&gt;&lt;b&gt;Reduced memory footprint&lt;/b&gt;&lt;br&gt;It's a huge dissipation to store a field for each property when you think that over 90% of the properties of a UI control typically stay at its initial values. Dependency properties solve these problems by only store modified properties in the instance. The default values are stored once within the dependency property. &lt;li&gt;&lt;b&gt;Value inheritance&lt;/b&gt;&lt;br&gt;When you access a dependency property the value is resolved by using a value resolution strategy. If no local value is set, the dependency property navigates up the logical tree until it finds a value. When you set the FontSize on the root element it applies to all textblocks below except you override the value.  &lt;li&gt;&lt;b&gt;Change notification&lt;/b&gt;&lt;br&gt;Dependency properties have a built-in change notification mechanism. By registering a callback in the property metadata you get notified, when the value of the property has been changed. This is also used by the databinding.&lt;/li&gt;&lt;/ul&gt;&lt;a name="valueres"&gt; &lt;p&gt;&lt;strong&gt;Value resolution strategy&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt; &lt;p&gt;Every time you access a dependency property, it internally resolves the value by following the precedence from high to low. It checks if a local value is available, if not if a custom style trigger is active,... and continues until it founds a value. At last the default value is always available. &lt;p&gt;&lt;img src="http://www.wpftutorial.net/images/valueresolution.jpg"&gt; &lt;a name="howitworks"&gt; &lt;p&gt;&lt;strong&gt;The magic behind it&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt; &lt;p&gt;Each WPF control registers a set of &lt;code&gt;DependencyProperties&lt;/code&gt; to the static &lt;code&gt;DependencyProperty&lt;/code&gt; class. Each of them consists of a key - that must be unique per type - and a metadata that contain callbacks and a default value. &lt;p&gt;All types that want to use &lt;code&gt;DependencyProperties&lt;/code&gt; must derive from &lt;code&gt;DependencyObject&lt;/code&gt;. This baseclass defines a key, value dictionary that contains local values of dependency properties. The key of an entry is the key defined with the dependency property.&lt;br&gt;When you access a dependency property over its .NET property wrapper, it internally calls &lt;code&gt;GetValue(DependencyProperty)&lt;/code&gt; to access the value. This method resolves the value by using a value resolution strategy that is explained in detail below. If a local value is available, it reads it directly from the dictionary. If no value is set if goes up the logical tree and searches for an inherited value. If no value is found it takes the default value defined in the property metadata. This sequence is a bit simplified, but it shows the main concept.  &lt;p&gt;&lt;img src="http://www.wpftutorial.net/images/depprop.png"&gt; &lt;a name="creation"&gt; &lt;p&gt;&lt;strong&gt;How to create a DependencyProperty&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt; &lt;p&gt;To create a DependencyProperty, add a static field of type &lt;code&gt;DepdencyProperty&lt;/code&gt; to your type and call &lt;code&gt;DependencyProperty.Register()&lt;/code&gt; to create an instance of a dependency property. The name of the DependendyProperty must always end with ...Property. This is a naming convention in WPF. &lt;p&gt;To make it accessable as a normal .NET property you need to add a property wrapper. This wrapper does nothing else than internally getting and setting the value by using the GetValue() and SetValue() Methods inherited from DependencyObject and passing the DependencyProperty as key. &lt;p&gt;&lt;b&gt;Important: Do not add any logic to these properties, because they are only called when you set the property from code. If you set the property from XAML the SetValue() method is called directly.&lt;/b&gt; &lt;p&gt;If you are using Visual Studio, you can type &lt;code&gt;propdp&lt;/code&gt; and hit 2x tab to create a dependency property.&lt;pre&gt;// Dependency Property&#xD;
public static readonly DependencyProperty CurrentTimeProperty = &#xD;
     DependencyProperty.Register( "CurrentTime", &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(DateTime),&#xD;
     &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(MyClockControl), &lt;a href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;new&lt;/a&gt; FrameworkPropertyMetadata(DateTime.Now));&amp;nbsp;&amp;nbsp; // .NET Property wrapper&#xD;
public DateTime CurrentTime&#xD;
{&#xD;
    get { return (DateTime)GetValue(CurrentTimeProperty); }&#xD;
    set { SetValue(CurrentTimeProperty, value); }&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;Each DependencyProperty provides callbacks for change notification, value coercion and validation. These callbacks are registered on the dependency property.&lt;pre&gt;&lt;a href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;new&lt;/a&gt; FrameworkPropertyMetadata( DateTime.Now, &#xD;
                       OnCurrentTimePropertyChanged, &#xD;
                       OnCoerceCurrentTimeProperty ),&#xD;
                       OnValidateCurrentTimeProperty );&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Value Changed Callback&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The change notification callback is a static method, that is called everytime when the value of the TimeProperty changes. The new value is passed in the EventArgs, the object on which the value changed is passed as the source.&lt;pre&gt;private static void OnCurrentTimePropertyChanged(DependencyObject source, &#xD;
        DependencyPropertyChangedEventArgs e)&#xD;
{&#xD;
    MyClockControl control = source as MyClockControl;&#xD;
    DateTime time = (DateTime)e.NewValue;&#xD;
    // Put some update logic here...&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Coerce Value Callback&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The coerce callback allows you to adjust the value if its outside the boundaries without throwing an exception. A good example is a progress bar with a Value set below the Minimum or above the Maximum. In this case we can coerce the value within the allowed boundaries. In the following example we limit the time to be in the past.&lt;pre&gt;private static object OnCoerceTimeProperty( DependencyObject sender, object data )&#xD;
{&#xD;
    if ((DateTime)data &amp;gt; DateTime.Now )&#xD;
    {&#xD;
        data = DateTime.Now;&#xD;
    }&#xD;
    return data;&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Validation Callback&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In the validate callback you check if the set value is valid. If you return false, an ArgumentException will be thrown. In our example demand, that the data is an instance of a &lt;code&gt;DateTime&lt;/code&gt;.&lt;pre&gt;private static bool OnValidateTimeProperty(object data)&#xD;
{&#xD;
    return data &lt;a href="http://www.google.com/search?q=is+msdn.microsoft.com"&gt;is&lt;/a&gt; DateTime;&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;a name="readonly"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Readonly DependencyProperties&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt;&#xD;
&lt;p&gt;Some dependency property of WPF controls are readonly. They are often used to report the state of a control, like the &lt;code&gt;IsMouseOver&lt;/code&gt; property. Is does not make sense to provide a setter for this value.&#xD;
&lt;p&gt;Maybe you ask yourself, why not just use a normal .NET property? One important reason is that you cannot set triggers on normal .NET propeties.&#xD;
&lt;p&gt;Creating a read only property is similar to creating a regular DependencyProperty. Instead of calling &lt;code&gt;DependencyProperty.Register()&lt;/code&gt; you call &lt;code&gt;DependencyProperty.RegisterReadonly()&lt;/code&gt;. This returns you a &lt;code&gt;DependencyPropertyKey&lt;/code&gt;. This key should be stored in a private or protected static readonly field of your class. The key gives you access to set the value from within your class and use it like a normal dependency property.&#xD;
&lt;p&gt;Second thing to do is registering a public dependency property that is assigned to &lt;code&gt;DependencyPropertyKey.DependencyProperty&lt;/code&gt;. This property is the readonly property that can be accessed from external.&lt;pre&gt;// Register the private key to set the value&#xD;
private static readonly DependencyPropertyKey IsMouseOverPropertyKey = &#xD;
      DependencyProperty.RegisterReadOnly("IsMouseOver", &#xD;
      &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(bool), &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(MyClass), &#xD;
      &lt;a href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;new&lt;/a&gt; FrameworkPropertyMetadata(false));&amp;nbsp;&amp;nbsp; // Register the public property to get the value&#xD;
public static readonly DependencyProperty IsMouseoverProperty = &#xD;
      IsMouseOverPropertyKey.DependencyProperty;&amp;nbsp;&amp;nbsp; // .NET Property wrapper&#xD;
public int IsMouseOver&#xD;
{&#xD;
   get { return (bool)GetValue(IsMouseoverProperty); }&#xD;
   private set { SetValue(IsMouseOverPropertyKey, value); }&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;a name="attached"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Attached Properties&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt;&#xD;
&lt;p&gt;Attached properties are a special kind of DependencyProperties. They allow you to attach a value to an object that does not know anything about this value.&#xD;
&lt;p&gt;A good example for this concept are layout panels. Each layout panel needs different data to align its child elements. The Canvas needs &lt;code&gt;Top&lt;/code&gt; and &lt;code&gt;Left&lt;/code&gt;, The DockPanel needs Dock, etc. Since you can write your own layout panel, the list is infinite. So you see, it's not possible to have all those properties on all WPF controls.&#xD;
&lt;p&gt;The solution are attached properties. They are defined by the control that needs the data from another control in a specific context. For example an element that is aligned by a parent layout panel.&#xD;
&lt;p&gt;To set the value of an attached property, add an attribute in XAML with a prefix of the element that provides the attached property. To set the the Canvas.Top and Canvas.Left property of a button aligned within a Canvas panel, you write it like this:&lt;pre&gt;&amp;lt;Canvas&amp;gt;&#xD;
    &amp;lt;Button Canvas.Top="20" Canvas.Left="20" Content="Click me!"/&amp;gt;&#xD;
&amp;lt;/Canvas&amp;gt;&amp;nbsp; &lt;/pre&gt;&lt;pre&gt;public static readonly DependencyProperty TopProperty =&#xD;
    DependencyProperty.RegisterAttached("Top", &#xD;
    &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(double), &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(Canvas),&#xD;
    &lt;a href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;new&lt;/a&gt; FrameworkPropertyMetadata(0d,&#xD;
        FrameworkPropertyMetadataOptions.Inherits));&amp;nbsp;&amp;nbsp; public static void SetTop(UIElement element, double value)&#xD;
{&#xD;
    element.SetValue(TopProperty, value);&#xD;
}&amp;nbsp;&amp;nbsp; public static double GetTop(UIElement element)&#xD;
{&#xD;
    return (double)element.GetValue(TopProperty);&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;a name="changes"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Listen to dependency property changes&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt;&#xD;
&lt;p&gt;If you want to listen to changes of a dependency property, you can subclass the type that defines the property and override the property metadata and pass an PropertyChangedCallback. But an much easier way is to get the &lt;code&gt;DependencyPropertyDescriptor&lt;/code&gt; and hookup a callback by calling &lt;code&gt;AddValueChanged()&lt;/code&gt;&lt;pre&gt;DependencyPropertyDescriptor textDescr = DependencyPropertyDescriptor.&#xD;
    FromProperty(TextBox.TextProperty, &lt;a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"&gt;typeof&lt;/a&gt;(TextBox));&amp;nbsp;&amp;nbsp; if (textDescr!= null)&#xD;
{&#xD;
    textDescr.AddValueChanged(myTextBox, delegate&#xD;
    {&#xD;
        // Add your propery changed logic here...&#xD;
    });&#xD;
}&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/pre&gt;&#xD;
&lt;p&gt;&lt;a name="clear"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;How to clear a local value&lt;/strong&gt;&lt;/p&gt;&lt;/a&gt;&#xD;
&lt;p&gt;Because &lt;code&gt;null&lt;/code&gt; is also a valid local value, there is the constant &lt;code&gt;DependencyProperty.UnsetValue&lt;/code&gt; that describes an unset value.&lt;pre&gt;button1.ClearValue( Button.ContentProperty );&amp;nbsp; &lt;/pre&gt;&lt;img src="http://www.cnblogs.com/umlchina/aggbug/1809264.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809264.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2010/08/26/1809222.html</id><title type="text">Introduction To Dependency Properties of WPF</title><summary type="text">http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-propertiesSo I was going to dive right in and do a part 2 on the WPF ListView tutorial from last week, but as I was wri...</summary><published>2010-08-26T08:29:00Z</published><updated>2010-08-26T08:29:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809222.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809222.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.switchonthecode.com/tutorials/wpf-tutorial-using-the-listview-part-1"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-properties&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;So I was going to dive right in and do a part 2 on the WPF ListView tutorial&#xD;
 from last week, but as I was writing the code I realized that a lot of &#xD;
it relies on some new and very different constructs that WPF provides to&#xD;
 developers.  Two of these are deep enough topics on their own that I &#xD;
thought it would be a good idea to give an introduction to them before I&#xD;
 dove back into the ListView stuff.  So today we are going to talk about&#xD;
 Dependency Properties, and in a future tutorial I will talk about how &#xD;
binding works in WPF.&lt;/p&gt;&#xD;
&lt;p&gt;What are dependency properties?  The quick definition from the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms752914.aspx"&gt;MSDN docs&lt;/a&gt;&#xD;
 says that a dependency property is a "property that is backed by the &#xD;
WPF property system."  Not really a great one-line explanation, but &#xD;
really, I can't blame them.  I can't come up with a good one line &#xD;
explanation either.  But essentially, it gives you a bunch of &#xD;
infrastructure to do all the things that you often want to do with a &#xD;
normal property - validate it, coerce it into a proper range, give out &#xD;
change notifications, and a number of other aspects. We aren't going to &#xD;
touch on everything that a dependency property can do today - because &#xD;
there is a lot.  But we will be talking about how to use them, how to &#xD;
create them, and how to set up validation/coercion/change notification.&lt;/p&gt;&#xD;
&lt;p&gt;So one of the first things I thought was weird about the definition &#xD;
of a dependency property is that it is a static.  This didn't make sense&#xD;
 to me at first - this property needs to store info relevant to a &#xD;
particular instance of a class, how is it going to do that if it is &#xD;
static?  But then, as I read more about them, I realized that a &#xD;
dependency property definition was exactly that - a definition.  You are&#xD;
 essentially saying that class A will have a property B - and it makes &#xD;
sense that that definition would be static.  The actual storage of a &#xD;
value for a dependency property is deep inside the WPF property system -&#xD;
 you never have to worry about it.&lt;/p&gt;&#xD;
&lt;p&gt;One thing you do have to note, though, is that for a class to contain dependency properties, it has to in some way derive from &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.dependencyobject.aspx"&gt;DependencyObject&lt;/a&gt;.  In deriving from this class, you get all the infrastructure needed to participate in the WPF dependency property system.&lt;/p&gt;&#xD;
&lt;p&gt;So at first glance, all the properties on the new WPF controls seem &#xD;
to be regular old properties.  But don't be fooled - this is often just a&#xD;
 simple wrapper around a dependency property (and the documentation will&#xD;
 usually say this).  So what does it mean for a property to be a simple &#xD;
wrapper around a dependency property?  Lets look at the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.height.aspx"&gt;FrameworkElement.Height&lt;/a&gt; property as an example:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;div &gt;&lt;div  style="font-family: monospace;"&gt;&lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;double&lt;/span&gt; Height&lt;br /&gt;&#xD;
&lt;span style="color: #000000;"&gt;{&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;get&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;return&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;GetValue&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;HeightProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;set&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; SetValue&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;HeightProperty&lt;/span&gt;, value&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Your first two questions are probably "What are these &lt;code&gt;GetValue&lt;/code&gt; and &lt;code&gt;SetValue&lt;/code&gt; functions?" and "What is this &lt;code&gt;HeightProperty&lt;/code&gt;?", and those are very good questions indeed.  Well, &lt;code&gt;GetValue&lt;/code&gt; and &lt;code&gt;SetValue&lt;/code&gt; are functions you get by deriving from &lt;code&gt;DependencyObject&lt;/code&gt;.  They allow you, as you might have guessed, to get and set the values of dependency properties.  The &lt;code&gt;HeightProperty&lt;/code&gt; is the dependency property itself - the static definition part of the &lt;code&gt;FrameworkElement&lt;/code&gt; class.&lt;/p&gt;&#xD;
&lt;p&gt;So far, this is just added complexity, and you're wondering why there&#xD;
 is yet another level of indirection on things.  But here is where &#xD;
things get interesting.  In the "old ways", to set up some sort of &#xD;
change notification on the &lt;code&gt;Height&lt;/code&gt; property here, you would have had to override it in a new class deriving from this &lt;code&gt;FrameworkElement&lt;/code&gt;&#xD;
 class and added whatever you needed in the 'set' part of the property &#xD;
here.  However, you no longer have to do things like that.  Instead, you&#xD;
 can:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;div &gt;&lt;div  style="font-family: monospace;"&gt;&lt;span style="color: #008080;"&gt;FrameworkElement&lt;/span&gt; myElement&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #008000; font-style: italic;"&gt;//&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008000; font-style: italic;"&gt;// myElement gets set to an element&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #008000; font-style: italic;"&gt;//&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #008080;"&gt;DependencyPropertyDescriptor&lt;/span&gt; dpd&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
dpd &lt;span style="color: #296d26;"&gt;=&lt;/span&gt; &lt;span style="color: #008080;"&gt;DependencyPropertyDescriptor&lt;/span&gt;.&lt;span style="color: #000000;"&gt;FromProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #008080;"&gt;FrameworkElement&lt;/span&gt;.&lt;span style="color: #000000;"&gt;HeightProperty&lt;/span&gt;, &lt;span style="color: #0600ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;FrameworkElement&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
dpd.&lt;span style="color: #000000;"&gt;AddValueChanged&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;myElement, myHeightChangedFunction&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;And now you have a function that will get called any time the height changes on &lt;code&gt;myElement&lt;/code&gt;!  I think that is pretty handy.  You can detach the hook just as easily:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;div &gt;&lt;div  style="font-family: monospace;"&gt;&lt;span style="color: #008080;"&gt;DependencyPropertyDescriptor&lt;/span&gt; dpd&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
dpd &lt;span style="color: #296d26;"&gt;=&lt;/span&gt; &lt;span style="color: #008080;"&gt;DependencyPropertyDescriptor&lt;/span&gt;.&lt;span style="color: #000000;"&gt;FromProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #008080;"&gt;FrameworkElement&lt;/span&gt;.&lt;span style="color: #000000;"&gt;HeightProperty&lt;/span&gt;, &lt;span style="color: #0600ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;FrameworkElement&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
dpd.&lt;span style="color: #000000;"&gt;RemoveValueChanged&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;myElement, myHeightChangedFunction&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Ok, enough about other people's dependency properties - lets go make &#xD;
our own!  Below we have a extremely simple class with a dependency &#xD;
property for "LastName", as well as a property wrapper around it:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;div &gt;&lt;div  style="font-family: monospace;"&gt;&lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;class&lt;/span&gt; Person &lt;span style="color: #296d26;"&gt;:&lt;/span&gt; &lt;span style="color: #008080;"&gt;DependencyObject&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #008080;"&gt;DependencyProperty&lt;/span&gt; LastNameProperty &lt;span style="color: #296d26;"&gt;=&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #008080;"&gt;DependencyProperty&lt;/span&gt;.&lt;span style="color: #000000;"&gt;Register&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"LastName"&lt;/span&gt;, &lt;span style="color: #0600ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;, &lt;span style="color: #0600ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;Person&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;string&lt;/span&gt; LastName&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;return&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;GetValue&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;LastNameProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; SetValue&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;LastNameProperty&lt;/span&gt;, value&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;The &lt;code&gt;Register&lt;/code&gt; call is pretty simple - you give the &#xD;
property a name (in this case "LastName"), you say what type of &#xD;
information the property will hold (in this case a string), and you say &#xD;
what type of object this property is attached to (in this case Person). &#xD;
 A little verbose, especially when you add in the property wrapper, but &#xD;
not too bad.  And I'm sure Microsoft will find a way to streamline the &#xD;
syntax in the next version of C#.&lt;/p&gt;&#xD;
&lt;p&gt;A little bit of a side note here - don't ever put anything but the &lt;code&gt;GetValue&lt;/code&gt; and &lt;code&gt;SetValue&lt;/code&gt;&#xD;
 calls inside the property wrapper.  This is because you never know if &#xD;
someone will set the property through the wrapper, or straight through a&#xD;
 &lt;code&gt;SetValue&lt;/code&gt; call - so you don't want to put any extra logic &#xD;
in the property wrapper.  For example, when you set the value of a &#xD;
dependency property in XAML, it will not use the property wrapper - it &#xD;
will hit the &lt;code&gt;SetValue&lt;/code&gt; call directly, bypassing anything that you happened to put in the property wrapper.&lt;/p&gt;&#xD;
&lt;p&gt;Back to creating dependency properties.  The constructor for &lt;code&gt;Register&lt;/code&gt; has a couple more optional arguments.  And we are going to jump right in and use them all!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;div &gt;&lt;div  style="font-family: monospace;"&gt;&lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;class&lt;/span&gt; Person &lt;span style="color: #296d26;"&gt;:&lt;/span&gt; &lt;span style="color: #008080;"&gt;DependencyObject&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #008080;"&gt;DependencyProperty&lt;/span&gt; LastNameProperty &lt;span style="color: #296d26;"&gt;=&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #008080;"&gt;DependencyProperty&lt;/span&gt;.&lt;span style="color: #000000;"&gt;Register&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"LastName"&lt;/span&gt;, &lt;span style="color: #0600ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;, &lt;span style="color: #0600ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;Person&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;, &lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;new&lt;/span&gt; &lt;span style="color: #008080;"&gt;PropertyMetadata&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"No Name"&lt;/span&gt;, LastNameChangedCallback, LastNameCoerceCallback&lt;span style="color: #000000;"&gt;)&lt;/span&gt;, &lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; LastNameValidateCallback&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;void&lt;/span&gt; LastNameChangedCallback&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #008080;"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color: #008080;"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; e&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #008080;"&gt;Console&lt;/span&gt;.&lt;span style="color: #000000;"&gt;WriteLine&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;e.&lt;span style="color: #000000;"&gt;OldValue&lt;/span&gt; &lt;span style="color: #296d26;"&gt;+&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;" "&lt;/span&gt; &lt;span style="color: #296d26;"&gt;+&lt;/span&gt; e.&lt;span style="color: #000000;"&gt;NewValue&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;object&lt;/span&gt; LastNameCoerceCallback&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #008080;"&gt;DependencyObject&lt;/span&gt; obj, &lt;span style="color: #0600ff;"&gt;object&lt;/span&gt; o&lt;span style="color: #000000;"&gt;)&lt;/span&gt; &lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;string&lt;/span&gt; s &lt;span style="color: #296d26;"&gt;=&lt;/span&gt; o &lt;span style="color: #0600ff;"&gt;as&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;if&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;s.&lt;span style="color: #000000;"&gt;Length&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; s &lt;span style="color: #296d26;"&gt;=&lt;/span&gt; s.&lt;span style="color: #000000;"&gt;Substring&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;, &lt;span style="color: #000000;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;return&lt;/span&gt; s&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;bool&lt;/span&gt; LastNameValidateCallback&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff;"&gt;object&lt;/span&gt; value&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;return&lt;/span&gt; value &lt;span style="color: #296d26;"&gt;!=&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #0600ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0600ff;"&gt;string&lt;/span&gt; LastName&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;get&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;return&lt;/span&gt; &lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;GetValue&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;LastNameProperty&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #0600ff;"&gt;set&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &amp;nbsp; SetValue&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;LastNameProperty&lt;/span&gt;, value&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;The two other arguments to &lt;code&gt;Register&lt;/code&gt; are a &lt;code&gt;PropertyMetadata&lt;/code&gt; instance and a &lt;code&gt;validateValueCallback&lt;/code&gt;.  There are a couple different classes that derive from &lt;code&gt;PropertyMetadata&lt;/code&gt;, but today we are just using the base one.  The &lt;code&gt;PropertyMetadata&lt;/code&gt; instance allows us to set a default value (in this case "No Name"), a property changed callback (&lt;code&gt;LastNameChangedCallback&lt;/code&gt;), and a coerce value callback (&lt;code&gt;LastNameCoerceCallback&lt;/code&gt;).&#xD;
  The default value does exactly what you might expect.  The change &#xD;
callback can do whatever you want it to do, and you have plenty of &#xD;
information with which to do it.  The &lt;code&gt;DependencyPropertyChangedEventArgs&lt;/code&gt; contain both the old and the new values of the property, as well as a reference to what property was changed.  And the &lt;code&gt;DependencyObject&lt;/code&gt;&#xD;
 passed in is the object on which the property was changed.  This is &#xD;
needed because, as you can see, this method is static.  So every time &#xD;
the "LastName" property is changed on any object, this function will get&#xD;
 called.&lt;/p&gt;&#xD;
&lt;p&gt;The same goes for the coerce callback - we get the object on which &#xD;
the property is being changed, and the possible new value.  Here we get &#xD;
the opportunity to change the value - in this case, apparently last &#xD;
names are forced to be 8 characters or less.&lt;/p&gt;&#xD;
&lt;p&gt;And finally, we have the &lt;code&gt;LastNameValidateCallback&lt;/code&gt;.  This&#xD;
 just gets the possible new value, and returns true or false.  If it &#xD;
returns false, an exception is blown - so in this case, if anyone ever &#xD;
tries to set a null last name, they better watch out.&lt;/p&gt;&#xD;
&lt;p&gt;So there you go, the basics on dependency property usage and &#xD;
creation.  There are a couple areas I haven't covered - inheritance, &#xD;
attached properties, and overriding metadata to name a few.  But &#xD;
hopefully this gets off on the right foot with respect to dependency &#xD;
properties, and I'll probably write a tutorial in the next few weeks on &#xD;
those other areas.  As always, questions and comments are welcome.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/umlchina/aggbug/1809222.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umlchina/archive/2010/08/26/1809222.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2009/04/01/1427632.html</id><title type="text">朋友的公司招.net程序员2名及项目经理1名</title><summary type="text">好久不来了，也不知道现在的规矩，发个帮朋友公司招人的广告不知道是不违规。违规的话请dudu删除吧！招收.net开发工程师2名 项目经理1名：1、 三年以上工作经验、两年以上.Net开发经验，精通C#、能指导程序员进行编码；2、具有B/S、C/S架构进销存项目开发经验；了解三层架构模式；3、精通SqlServer和mysql数据库原理及应用 4、有比较丰富的项目架构设计经验；5、对数据库设计熟悉、能...</summary><published>2009-04-01T15:53:00Z</published><updated>2009-04-01T15:53:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2009/04/01/1427632.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2009/04/01/1427632.html"/></entry><entry><id>http://www.cnblogs.com/umlchina/archive/2008/05/07/1186398.html</id><title type="text">Simple Object Access Protocol (SOAP) 1.1 </title><summary type="text">Simple Object Access Protocol (SOAP) 1.1 W3C Note 08 May 2000This version:http://www.w3.org/TR/2000/NOTE-SOAP-20000508Latest version:http://www.w3.org/TR/SOAPAuthors (alphabetically):Don Box, DevelopM...</summary><published>2008-05-07T02:40:00Z</published><updated>2008-05-07T02:40:00Z</updated><author><name>umlchina</name><uri>http://www.cnblogs.com/umlchina/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umlchina/archive/2008/05/07/1186398.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umlchina/archive/2008/05/07/1186398.html"/></entry></feed>
