<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>简单生活 -- Kevin Yang的博客 &#187; 反射</title>
	<atom:link href="http://www.imkevinyang.com/tags/%e5%8f%8d%e5%b0%84/feed" rel="self" type="application/rss+xml" />
	<link>http://www.imkevinyang.com</link>
	<description>It&#039;s all about sharing</description>
	<lastBuildDate>Sun, 05 Feb 2012 15:37:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Silverlight2 动态加载程序集&#8212;OnDemand模式(Dynamic Load Assembly)</title>
		<link>http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html</link>
		<comments>http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html#comments</comments>
		<pubDate>Mon, 02 Mar 2009 17:44:00 +0000</pubDate>
		<dc:creator>Kevin Yang</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[技术随笔]]></category>
		<category><![CDATA[OnDemand]]></category>
		<category><![CDATA[RTM]]></category>
		<category><![CDATA[Xap]]></category>
		<category><![CDATA[动态加载]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[模式]]></category>
		<category><![CDATA[程序集]]></category>

		<guid isPermaLink="false">http://www.imkevinyang.com/?p=113</guid>
		<description><![CDATA[<p>随着我们开发的进行，我们的Silverlight生产出来的Xap包可能会越来越大，这个时候我们可能会考虑将某些功能集独立到某个程序集中，放置在SL可以访问的路径下，然后在需要的时候动态去加载这个程序集。关于这方面的例子网上也有不少，但大多是告诉你在下载dll之后通过反射来实例化类型。我们知道反射是一&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>随着我们开发的进行，我们的Silverlight生产出来的Xap包可能会越来越大，这个时候我们可能会考虑将某些功能集独立到某个程序集中，放置在SL可以访问的路径下，然后在需要的时候动态去加载这个程序集。关于这方面的例子网上也有不少，但大多是告诉你在下载dll之后通过反射来实例化类型。我们知道反射是一种比较慢的操作，对于这里我们使用的程序集，其实内部有什么类我们都是知道的，那么有没有一种办法可以即获得动态加载程序集的好处，又不用付出反射的代码呢？答案是有的。下面我通过一个简单的Demo来演示一下怎么实现。</p>
<p>首先还是如下图一样建立三个工程：</p>
<p><a href="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image002.jpg"><img style="display: inline; border: 0px;" title="clip_image002" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image002-thumb.jpg" border="0" alt="clip_image002" width="461" height="168" /></a></p>
<p>其中Extension是我们独立出来的程序集，需要动态加载的，里面我们只设置了一个非常简单的Ext类，这个Ext类只有一个静态的Encrypt方法，用来加密字符串的。下面两个工程分别是我们的主SL应用程序和测试网站。</p>
<p>我们的主SL程序非常简单，界面如下</p>
<p><a href="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image004.jpg"><img style="display: inline; border: 0px;" title="clip_image004" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image004-thumb.jpg" border="0" alt="clip_image004" width="282" height="29" /></a></p>
<p>输入一个任意字符串，然后点击加密就会调用Ext的静态加密方法，并弹出加密之后的字符串给用户。</p>
<p>好，让我们先按照传统的思路来做。</p>
<p>由于这个独立程序集是我们已知的，所以我们可以直接添加引用到主SL工程中。（这里为什么我要强调“已知”这个概念呢？因为只有对于我们未知的可能实现了某些契约了的程序集，我们一般会通过LoadAssembly的方法而不是直接添加引用的方式来加载）</p>
<p>在这里需要<strong>注意</strong>一点，当我们添加完引用之后，我们需要设置其CopyLocal的属性</p>
<p><a href="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image006.jpg"><img style="display: inline; border: 0px;" title="clip_image006" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image006-thumb.jpg" border="0" alt="clip_image006" width="436" height="58" /></a></p>
<p>这样该dll不会被自动打包到Xap包中，否则就没意义了。</p>
<p>OK，到现在为止，我们所做的都是一些标准的DotNet特性的东西。接下来的部分比较有意思了。</p>
<p>我们绑定加密按钮的Click事件，并在处理函数里面加入如下代码：</p>
<p><a href="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image008.jpg"><img style="display: inline; border: 0px;" title="clip_image008" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image008-thumb.jpg" border="0" alt="clip_image008" width="566" height="459" /></a></p>
<p>我们定义了一个标识变量_assemblyLoaded来指示当前使用的加密程序集是否已经成功加载了。如果是的话，则直接执行ShowEncryptedText。否则我们加载程序集。为了在加载之后能够自动继续执行一致的逻辑，在这里我使用了后台线程对象BackgroundWorker，不断轮询程序集是否成功加载了，直到加载成功为止。然后我们通过UserControl的Dispatcher对象来异步调用加密逻辑。<strong>这里如果直接调用ShowEncryptedText会抛出线程访问错误，原因不详</strong>。</p>
<p>我们先来看一下加载程序集的逻辑。</p>
<p><a href="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image010.jpg"><img style="display: inline; border: 0px;" title="clip_image010" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image010-thumb.jpg" border="0" alt="clip_image010" width="528" height="473" /></a></p>
<p>这段代码比较简单，不做太多解释。</p>
<p>我们再来看一下，我们的ShowEncryptedText函数的实现</p>
<p><a href="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image012.jpg"><img style="display: inline; border: 0px;" title="clip_image012" src="http://www.imkevinyang.com/wp-content/uploads/2009/03/clip-image012-thumb.jpg" border="0" alt="clip_image012" width="645" height="179" /></a></p>
<p>很简洁的代码，我们仅仅使用MessageBox来显示加密过后的字符串。在这里Ext.Encrypt方法是来自我们刚刚加载成功的外部程序集。</p>
<p>这里有一个问题，为什么我们要把这么短的代码放到一个专门的函数里头呢？为什么不在OnEncrypt事件处理函数中就直接调用呢？这其实是先有鸡还是先有蛋的问题了(*^__^*) DotNet在进入一个方法的时候，会预先查找函数里面使用到的所有方法所在的程序集，因此如果我们直接调用Ext的方法，那么，啊，哈，我不说你也知道了吧。（这个特性在Javascript中也有，JS在执行到一个函数时，会预先找出函数内使用的所有变量，所以不论你在函数内部哪个地方声明的变量，都是一样的效果）</p>
<p>也就是因为上面这个原因，所以在方法上面要加上NoInlining编译属性，是为了防止编译器自作聪明把短函数内联了导致异常。</p>
<p>希望此文能帮到你~</p>
<p>——<em><a href="http://www.imkevinyang.com/2009/03/silverlight2-%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E7%A8%8B%E5%BA%8F%E9%9B%86-ondemand%E6%A8%A1%E5%BC%8Fdynamic-load-assembly.html" target="_self">Kevin Yang</a></em></p>

	标签：<a href="http://www.imkevinyang.com/tags/ondemand" title="OnDemand" rel="tag">OnDemand</a>, <a href="http://www.imkevinyang.com/tags/rtm" title="RTM" rel="tag">RTM</a>, <a href="http://www.imkevinyang.com/categories/techarticles/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/silverlight" title="Silverlight" rel="tag">Silverlight</a>, <a href="http://www.imkevinyang.com/tags/xap" title="Xap" rel="tag">Xap</a>, <a href="http://www.imkevinyang.com/tags/%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd" title="动态加载" rel="tag">动态加载</a>, <a href="http://www.imkevinyang.com/tags/%e5%8f%8d%e5%b0%84" title="反射" rel="tag">反射</a>, <a href="http://www.imkevinyang.com/categories/techarticles" title="技术随笔" rel="tag">技术随笔</a>, <a href="http://www.imkevinyang.com/tags/%e6%a8%a1%e5%bc%8f" title="模式" rel="tag">模式</a>, <a href="http://www.imkevinyang.com/tags/%e7%a8%8b%e5%ba%8f%e9%9b%86" title="程序集" rel="tag">程序集</a><br />

	<h4 style="background-color:#3B3B3B;border-bottom:2px groove gray;color:#F2F2F2;margin-top:20px;padding:6px 6px 6px 15px;margin:20px 0px 0px 0px">你可能对下面的文章感兴趣</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.imkevinyang.com/2009/09/blend%e5%b0%8f%e8%b4%b4%e5%a3%ab%e6%94%b9%e5%8f%98%e9%bc%a0%e6%a0%87%e6%bb%9a%e8%bd%ae%e7%9a%84%e9%bb%98%e8%ae%a4%e8%a1%8c%e4%b8%ba-2.html" title="Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为 (2009/09/18)">Blend小贴士&mdash;&mdash;改变鼠标滚轮的默认行为</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/02/silverlight-2-rtm-%e5%a4%9a%e5%9b%bd%e8%af%ad%e8%a8%80%e6%94%af%e6%8c%81%ef%bc%88%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%9c%ac%e5%9c%b0%e5%8c%96%ef%bc%89.html" title="Silverlight 2 RTM 多国语言支持（应用程序本地化） (2009/02/28)">Silverlight 2 RTM 多国语言支持（应用程序本地化）</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/silverlight-2%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bdxap%e5%8c%85%e4%b8%ad%e7%9a%84%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight 2动态加载Xap包中的程序集 (2009/03/02)">Silverlight 2动态加载Xap包中的程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/05/silverlight-4ria-services-%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96seo.html" title="Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO) (2010/05/04)">Silverlight 4+RIA Services&#8211;搜索引擎优化(SEO)</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/04/silverlight-seo%ef%bc%88%e6%90%9c%e7%b4%a2%e5%bc%95%e6%93%8e%e4%bc%98%e5%8c%96%ef%bc%89%e7%99%bd%e7%9a%ae%e4%b9%a6.html" title="Silverlight SEO（搜索引擎优化）白皮书 (2009/04/06)">Silverlight SEO（搜索引擎优化）白皮书</a> </li>
	<li><a href="http://www.imkevinyang.com/2011/09/silverlight%e4%b8%ad%e6%97%a0%e6%b3%95%e8%ae%be%e7%bd%ae%e5%8d%ab%e6%98%9f%e7%a8%8b%e5%ba%8f%e9%9b%86%e4%b8%ba%e4%b8%ad%e7%ab%8b%e8%b5%84%e6%ba%90%e7%a8%8b%e5%ba%8f%e9%9b%86.html" title="Silverlight中无法设置卫星程序集为中立资源程序集 (2011/09/05)">Silverlight中无法设置卫星程序集为中立资源程序集</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/02/silverlight%e5%90%af%e7%94%a8assembly-caching%e4%b9%8b%e5%90%8e%e9%93%81%e9%80%9a%e7%94%a8%e6%88%b7%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae.html" title="Silverlight启用Assembly Caching之后铁通用户无法访问 (2010/02/13)">Silverlight启用Assembly Caching之后铁通用户无法访问</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/03/silverlight%e7%9a%84%e4%be%9d%e8%b5%96%e5%b1%9e%e6%80%a7%e4%b8%8e%e9%99%84%e5%8a%a0%e5%b1%9e%e6%80%a7.html" title="Silverlight的依赖属性与附加属性 (2010/03/28)">Silverlight的依赖属性与附加属性</a> </li>
	<li><a href="http://www.imkevinyang.com/2010/09/%e4%bd%bf%e7%94%a8xamlreader-load%e6%9e%84%e5%bb%ba%e9%85%8d%e7%bd%ae%e5%9e%8b%e8%87%aa%e5%ae%9a%e4%b9%89%e6%8e%a7%e4%bb%b6.html" title="使用XamlReader.Load构建配置型自定义控件 (2010/09/03)">使用XamlReader.Load构建配置型自定义控件</a> </li>
	<li><a href="http://www.imkevinyang.com/2009/03/%e5%9b%be%e7%89%87%e7%ad%89%e8%b5%84%e6%ba%90%e7%9a%84%e5%bc%95%e7%94%a8%e8%b7%af%e5%be%84%e9%97%ae%e9%a2%98.html" title="图片等资源的引用路径问题 (2009/03/19)">图片等资源的引用路径问题</a> </li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.imkevinyang.com/2009/03/silverlight2-%e5%8a%a8%e6%80%81%e5%8a%a0%e8%bd%bd%e7%a8%8b%e5%ba%8f%e9%9b%86-ondemand%e6%a8%a1%e5%bc%8fdynamic-load-assembly.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: www.imkevinyang.com @ 2012-02-08 18:53:21 -->
