﻿<?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>Timothy&#039;s Space &#187; dynamic</title>
	<atom:link href="http://www.xiaozhou.net/tag/dynamic/feed" rel="self" type="application/rss+xml" />
	<link>http://www.xiaozhou.net</link>
	<description>君看一叶舟，出没风波里</description>
	<lastBuildDate>Tue, 07 Feb 2012 04:28:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>小试Emit</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/try_emit-2010-11-25.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/try_emit-2010-11-25.htm#comments</comments>
		<pubDate>Thu, 25 Nov 2010 15:18:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Emit]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[程序集]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e5%b0%8f%e8%af%95emit-2010-11-25.htm</guid>
		<description><![CDATA[.NET中的Emit，其实是个很强大的东东，它允许你在你的程序运行时，动态的生成代码。看到这里，也许大家会联想到Reflection，的确，Reflection也是我们平时用得比较多的一种技术，通过Reflection，我们能通过程序集中的元数据，动态的生成目标程序集的Instance，并执行它。而Emit的功能，恰恰和Reflection遥相呼应，前者允许我们动态的生成代码，后者允许我们动态的“查看”和运行代码。Emit和Reflection合在一起，简直就是双剑合璧，简直就是幸福的一家……难怪，微软也很邪恶的把Emit放在了System.Reflection.Emit。 其实哥平时的开发中，用得比较多的，还是Reflection(反射)了，不过早已久仰Emit的大名，又没闲暇时间来窥探一把，最近总算比较闲了，决心研究研究强大的Emit。 话不多说，代码是最有力的说明，先献上一个通过Emit动态创建并生成程序集的例子： ?View Code CSHARP1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 using System; using System.Reflection; using System.Reflection.Emit; &#160; namespace Emit_Learn &#123; class Program &#123; static void Main&#40;string&#91;&#93; args&#41; &#123; var name = new AssemblyName&#40;&#34;HelloEmit&#34;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>.NET中的Emit，其实是个很强大的东东，它允许你在你的程序运行时，动态的生成代码。看到这里，也许大家会联想到Reflection，的确，Reflection也是我们平时用得比较多的一种技术，通过Reflection，我们能通过程序集中的元数据，动态的生成目标程序集的Instance，并执行它。而Emit的功能，恰恰和Reflection遥相呼应，前者允许我们动态的生成代码，后者允许我们动态的“查看”和运行代码。Emit和Reflection合在一起，简直就是双剑合璧，简直就是幸福的一家……难怪，微软也很邪恶的把Emit放在了System.Reflection.Emit。</p>
<p>其实哥平时的开发中，用得比较多的，还是Reflection(反射)了，不过早已久仰Emit的大名，又没闲暇时间来窥探一把，最近总算比较闲了，决心研究研究强大的Emit。</p>
<p>话不多说，代码是最有力的说明，先献上一个通过Emit动态创建并生成程序集的例子：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p892code3'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8923"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p892code3"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Reflection</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Reflection.Emit</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Emit_Learn
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            var name <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> AssemblyName<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            var assemblyBuilder <span style="color: #008000;">=</span>
            AppDomain<span style="color: #008000;">.</span><span style="color: #0000FF;">CurrentDomain</span><span style="color: #008000;">.</span><span style="color: #0000FF;">DefineDynamicAssembly</span><span style="color: #008000;">&#40;</span>name,
            AssemblyBuilderAccess<span style="color: #008000;">.</span><span style="color: #0000FF;">RunAndSave</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//创建程序集</span>
              var modelBuilder <span style="color: #008000;">=</span> assemblyBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineDynamicModule</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit&quot;</span>,             <span style="color: #666666;">&quot;HelloEmit.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//创建模块</span>
              var typeBuilder <span style="color: #008000;">=</span> modelBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineType</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//定义类型</span>
              var methodBuilder <span style="color: #008000;">=</span> typeBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Execute&quot;</span>,                                 MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Public</span>,                                 <span style="color: #0600FF; font-weight: bold;">null</span>,                                 <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//创建MethodBuilder</span>
            var il <span style="color: #008000;">=</span> methodBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">GetILGenerator</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//获取ILGenerator，用于生成方法的IL</span>
            il<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldstr</span>, <span style="color: #666666;">&quot;Hello, Emit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            il<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Call</span>,                     <a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span style="color: #008000;">typeof</span></a><span style="color: #008000;">&#40;</span>Console<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;WriteLine&quot;</span>,                     <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Type<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span> <a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span style="color: #008000;">typeof</span></a><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            il<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ret</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            typeBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            assemblyBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">Save</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//保存动态生成的程序集到磁盘文件</span>
&nbsp;
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>在IDE中输入以上代码，F5运行，你会发现，在你的程序的Debug目录，会生成一个HelloEmit.dll。没错，这就是我们的程序动态生成的程序集，并且它是可执行的。以上的代码，动态生成的程序集，包含一个叫HelloEmit的类，类中有一个public属性的Execute方法。方法中调用Console输出字符串：Hello,Emit</p>
<p>这个类，等价于如下的C#代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p892code4'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8924"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p892code4"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">internal</span> <span style="color: #6666cc; font-weight: bold;">class</span> HelloEmit
<span style="color: #008000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// Methods</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Execute<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Hello, Emit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>我们也可以使用.NET Reflector一类的工具，打开生成的Dll查看，顺便验证一下。</p>
<p>Emit适用的场景：适用于对业务灵活性要求很高的系统，可以在运行时动态更改业务逻辑，并动态生成代码。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/try_emit-2010-11-25.htm/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (五) Plugins Manager 源码下载</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-5-plugins-manager-source-code-download-2008-04-01.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-5-plugins-manager-source-code-download-2008-04-01.htm#comments</comments>
		<pubDate>Tue, 01 Apr 2008 15:17:44 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[下载]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[源码]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=191</guid>
		<description><![CDATA[今天和同事一起把Plugins Manager放在了google code上面。大家可以从下面的地址获取所有的源码了。 http://code.google.com/p/dynamic-plugins-manager/ 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>今天和同事一起把Plugins Manager放在了google code上面。大家可以从下面的地址获取所有的源码了。</p>
<p>http://code.google.com/p/dynamic-plugins-manager/</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-5-plugins-manager-source-code-download-2008-04-01.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (四) 插件及Demo源码下载</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-4-plug-ins-and-source-code-download-demo-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-4-plug-ins-and-source-code-download-demo-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 08:12:16 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[下载]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[源码]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=190</guid>
		<description><![CDATA[这里提供了插件的Demo程序，和编译好的Plugin Manager下载。 Plugin Manager的代码待整理后放上来。[cool] 开发运行环境： Windows Vista Ultimate .NET Framework 3.5 Microsoft Visual Studio 2008 点击下载此文件 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>这里提供了插件的Demo程序，和编译好的Plugin Manager下载。<br />
   Plugin Manager的代码待整理后放上来。[cool]</p>
<p>    开发运行环境：<br />
   Windows Vista Ultimate<br />
     .NET Framework 3.5<br />
    Microsoft Visual Studio 2008</p>
<p>   <a href="/attachments/month_0803/k200832916121.rar" target="_blank">点击下载此文件</a></p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-4-plug-ins-and-source-code-download-demo-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (三) Demo</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 07:58:23 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[示例]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=189</guid>
		<description><![CDATA[下面来演示一下Plugins Manager，先看看我们事先做好的Interface和两个具体实现的插件. Interface，接口定义： [code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Component { public interface IComponent { string Invoke(); } } [/code] 整个接口，只声明了一个Invoke方法，这也是具体的插件必须实现的一个方法。 第一个插件类 class1.cs [code] namespace Component { public class Class1 : MarshalByRefObject,IComponent { string message = string.Empty; int number; float number2; public Class1(string input, int num) { message = input; number [...]]]></description>
			<content:encoded><![CDATA[<p>下面来演示一下Plugins Manager，先看看我们事先做好的Interface和两个具体实现的插件.</p>
<p>   Interface，接口定义：<br />
  [code]<br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;</p>
<p>namespace Component<br />
{<br />
    public interface IComponent<br />
    {<br />
        string Invoke();<br />
    }<br />
}<br />
   [/code]</p>
<p>    整个接口，只声明了一个Invoke方法，这也是具体的插件必须实现的一个方法。</p>
<p>   第一个插件类 class1.cs<br />
    [code]<br />
    namespace Component<br />
{</p>
<p>    public class Class1 : MarshalByRefObject,IComponent<br />
    {<br />
        string message = string.Empty;<br />
        int number;<br />
        float number2;</p>
<p>        public Class1(string input, int num)<br />
        {<br />
            message = input;<br />
            number = num;<br />
            number2 = 0;<br />
        }</p>
<p>        public Class1(int num1, float num2)<br />
        {<br />
            message = "none";<br />
            number = num1;<br />
            number2 = num2;<br />
        }</p>
<p>        public string Invoke()<br />
        {<br />
            return "This is TestLibrary. member---message:" + message + "number:" + number.ToString() + "number2:" +number2.ToString();<br />
        }<br />
    }<br />
}</p>
<p>    [/code]</p>
<p>    第二个插件类 class2.cs<br />
    [code]<br />
namespace Component<br />
{<br />
    public class Class2 : MarshalByRefObject,IComponent<br />
    {<br />
        public Class2()<br />
        {<br />
        }</p>
<p>        public string Invoke()<br />
        {<br />
            return "This is TestLibrary2 without construct param";<br />
        }<br />
    }<br />
}</p>
<p>    [/code]</p>
<p>    这里我们看到区别，第一个插件，需要构造函数，第二个插件不需要构造函数，所以在配置文件中，第二个插件可以关闭掉ConstructParam这个节点。</p>
<p>   下面我们将Class1.cs编译好，放到插件目录中，改名为TestLibrary.dll，将Class2.cs直接改名为TestLibrary2.cs，放到插件目录中。<br />
   演示的目的：插件1需要在加载时，构造初始化函数，而插件2不需要。<br />
               插件1，是已经编译好的dll，不需要实时编译，但是插件2需要。</p>
<p>   下面是测试的截图</p>
<p>   1.插件目录，一个放入编译好的dll，一个放入.cs源码</p>
<p><img src="/pics/PluginManager/demo1.jpg" border="0" alt=""/></p>
<p>     2.启动测试程序，看到2个插件都已经被加载</p>
<p><img src="/pics/PluginManager/demo2.jpg" border="0" alt=""/></p>
<p>     3.此时，再查看插件的目录，我们会看到Plugin Manager为我们编译，并生成的插件2的dll</p>
<p><img src="/pics/PluginManager/demo3.jpg" border="0" alt=""/></p>
<p>   4.查看插件的日志记录</p>
<p><img src="/pics/PluginManager/demo4.jpg" border="0" alt=""/></p>
<p>   5.插件的调用<br />
   选中TestLibrary,点击Invoke按钮：</p>
<p><img src="/pics/PluginManager/demo5.jpg" border="0" alt=""/></p>
<p>  选中TestLibrary2,点击Invoke按钮：</p>
<p><img src="/pics/PluginManager/demo6.jpg" border="0" alt=""/></p>
<p>   6.插件的动态卸载和发布<br />
     a.动态卸载，可以直接使用Plugins Manager的UnloadPluginByName直接通过程序调用卸载。也可以手动打开插件的配置文件，将EnablePlugin设置为False<br />
       b.动态发布，直接在插件目录中，建立一个新的子目录，然后将插件的dll和xml配置文件直接拷入即可<br />
     关于第6点，这些功能的演示，截图比较麻烦，大家可以直接使用测试程序测试即可。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (二) 配置及实现分析</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 07:24:58 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[分析]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[实现]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[管理器]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=188</guid>
		<description><![CDATA[整个Plugins Manager是一个基于dll的程序集，开发平台，基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢？没别的原因，只要是为了尝试一下Linq to XML [cool] 使用改组件，需要在应用程序中，添加引用。另外，还需要在应用程序中，建立相关的配置项： [code] [/code] PluginsPath是插件的主目录，里面通过子目录的方式，存放不同的插件。Plugins Manager在启动的时候，会遍历插件主目录，并搜寻可加载的插件。 LogPath是插件的日志目录，里面的日志文件，会详细记载插件管理器当前的运行情况。 另外，在Plugins Manager中，区别不同的插件，是根据不同的插件名称来决定的，这取决于插件dll的命名。 对于不同的插件，Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件，命名需要和插件dll相一致。 下面是一个配置文件的示例： [code] Component.Class1 True D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll [/code] TypeName:插件的类名，和具体的插件命名空间和类名有关，Plugins Manager根据配置文件提供此相关信息，通过.NET的反射技术，生成具体的插件Instance EnablePlugin:插件开关，True表示当前插件可用，False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定，也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化，并留意EnablePlugin开关，以决定是否动态加载或者卸载该插件。 ConstructParams:此节点，及其子节点，用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数，以及类型，和初始化的值。构造初始化函数，也是在.NET的反射中实现。这里要注意，节点顺序和构造函数参数顺序有关。如果插件不需要构造函数，可以关闭此节点。 ReferenceList:此节点用以需要动态编译的插件，如果插件代码中还引用了其他的程序集，需要在此进行描述。 此外，插件还提供了事件通知功能，供应用程序进行响应和处理，实现的事件类型有以下几种： [code] public enum PluginEventType { PluginLoadOver, //所有插件加载完毕 PluginAdded, //插件新增完毕 PluginRemoved, //插件卸载完毕 PluginStopped, //插件管理器已停止 PluginStarted //插件管理器已启动 } [/code] 插件的事件参数定义如下，只包含简单的事件类型和文本描述： [code] public [...]]]></description>
			<content:encoded><![CDATA[<p>整个Plugins Manager是一个基于dll的程序集，开发平台，基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢？没别的原因，只要是为了尝试一下Linq to XML [cool]</p>
<p>    使用改组件，需要在应用程序中，添加引用。另外，还需要在应用程序中，建立相关的配置项：<br />
[code]<br />
<?xml version="1.0" encoding="utf-8" ?><br />
<configuration><br />
  <appSettings><br />
    <add key="PluginsPath" value="D:\MyCode\C# Projects\DynamicPlugInsApp\DynamicPlugInsApp\bin\Debug\Plugins"/><br />
    <add key="LogPath" value="D:\MyCode\C# Projects\DynamicPlugInsApp\DynamicPlugInsApp\bin\Debug\Log"/><br />
  </appSettings><br />
</configuration><br />
[/code]</p>
<p>    PluginsPath是插件的主目录，里面通过子目录的方式，存放不同的插件。Plugins Manager在启动的时候，会遍历插件主目录，并搜寻可加载的插件。<br />
   LogPath是插件的日志目录，里面的日志文件，会详细记载插件管理器当前的运行情况。</p>
<p>   另外，在Plugins Manager中，区别不同的插件，是根据不同的插件名称来决定的，这取决于插件dll的命名。<br />
   对于不同的插件，Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件，命名需要和插件dll相一致。<br />
   下面是一个配置文件的示例：<br />
[code]<br />
<?xml version="1.0" encoding="utf-8" ?></p>
<plugin>
  <typeName>Component.Class1</typeName><br />
  <enablePlugin>True</enablePlugin><br />
  <constructParams></p>
<param type="string" value="msadc" />
<param type="int" value="12" />
  </constructParams><br />
  <referenceList><br />
   <reference>D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll</reference><br />
  </referenceList>
</plugin>
[/code]</p>
<p>   TypeName:插件的类名，和具体的插件命名空间和类名有关，Plugins Manager根据配置文件提供此相关信息，通过.NET的反射技术，生成具体的插件Instance<br />
   EnablePlugin:插件开关，True表示当前插件可用，False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定，也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化，并留意EnablePlugin开关，以决定是否动态加载或者卸载该插件。<br />
  ConstructParams:此节点，及其子节点，用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数，以及类型，和初始化的值。构造初始化函数，也是在.NET的反射中实现。<span style="color:Red">这里要注意，节点顺序和构造函数参数顺序有关</span>。如果插件不需要构造函数，可以关闭此节点。<br />
  ReferenceList:此节点用以需要动态编译的插件，如果插件代码中还引用了其他的程序集，需要在此进行描述。</p>
<p>  此外，插件还提供了事件通知功能，供应用程序进行响应和处理，实现的事件类型有以下几种：</p>
<p>  [code]<br />
    public enum PluginEventType<br />
    {<br />
        PluginLoadOver, //所有插件加载完毕<br />
        PluginAdded,      //插件新增完毕<br />
        PluginRemoved,  //插件卸载完毕<br />
        PluginStopped,   //插件管理器已停止<br />
        PluginStarted     //插件管理器已启动<br />
    }<br />
   [/code]</p>
<p>   插件的事件参数定义如下，只包含简单的事件类型和文本描述：</p>
<p>    [code]<br />
    public class PluginEventArgs : EventArgs<br />
    {<br />
        #region Private Members<br />
        public PluginEventType EventType { get; set; }<br />
        public string EventMessage { get; set; }<br />
        #endregion</p>
<p>        public PluginEventArgs(PluginEventType eventtype, string message)<br />
        {<br />
            EventType = eventtype;<br />
            EventMessage = message;<br />
        }</p>
<p>    }<br />
   [/code]</p>
<p>   以上是使用该插件，需要配置的地方，下一篇日志，将演示该插件的Demo.</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager (一) 介绍</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-1-introduction-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-1-introduction-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 06:55:32 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[介绍]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=187</guid>
		<description><![CDATA[Dynamic Plugins Manager是一个基于.NET的动态插件管理组件，也是我在业余时间做的一个小东东，代码在07年底就开始动工，因为一直没充裕时间完成，趁这个周末休息，加班加点的Coding，出来了一个原型，估计里面还有很多的显而易见的以及隐而未现的bug。 设计这个组件的初衷，是为了能方便的应用于今后的项目中。先进的企业级项目中，变化最为突出的，还是业务，业务的变化，直接导致编码中业务逻辑代码的变化。如果将这些业务逻辑混杂在一起，业务的变化，最终会导致代码的混乱，甚至难以维护。这对于一个长期迭代的项目来说，是相当痛苦的事。就像直接拿一个成千上万行的代码给开发人员，估计开发人员不是晕厥，就是吐血。而一个难以维护的业务逻辑代码，对于每一次迭代，都是一次冒险。很可能在某次的迭代中，会对以前的业务逻辑，产生影响或者风险。 对于复杂的业务逻辑，需要进行重构，并且将不断变化的业务逻辑，抽离出来。比较折中的方法，就是将这些变化的逻辑，做成独立的插件形式。这样一来，独立的业务，在物理上进行了分离。开发人员也不用担心修改某处业务逻辑，会影响其他的业务模块。而动态的插件管理形式，对后期维护也带来益处，独立的业务逻辑插件之间，不会相互影响。开发人员还可以在程序运行而又不影响业务的情况下，动态的发布、替换原有的业务逻辑模块。 Dynamic Plugins Manager(以下简称Plugins Manager)，也就是按照这样的思路和需求来设计的，其实现的功能，具体有一下几个特点： 1.所有的插件，都以DLL程序集的方式发布,Plugins Manager在启动的时候，搜索加载所有可加载的插件并进行加载 2.Plugins Manager，支持插件的动态卸载功能。借助于AppDomain的特性，所有的组件，在动态加载后，可以动态从内存中卸载。插件的实现，需要继承自MarshalByRefObject。 3.与接口无依赖性，Plugins Manager负责插件的管理、动态加载、动态卸载、调用。但是和具体的插件接口无关，这样一来，开发人员可以定义自己的插件接口，并开发不同的插件实现接口。 4.插件可以动态发布和卸载,Plugins Manager会监视当前目录中，插件的变化，对于以xcopy方式，拷贝入插件目录的插件，可以进行动态加载。对于插件的卸载，可以Plugins Manager提供的接口进行动态卸载，也可以实时更改插件配置文件中的具体开关进行卸载。 5.动态编译功能：Plugins Manager允许直接发布插件代码。通过读取插件配置文件中的引用信息，可以直接从代码生成dll插件，并加载。 6.允许插件实现不同的构造函数重载，并将构造函数参数以及值信息，定义在插件配置文件中。Plugins Manager在加载插件的时候，采用配置文件中的值，调用相应的构造函数，并加载插件。 7.事件通知：Plugins Manager在不同的插件操作完成后，会触发相应的事件机制，通知客户端程序进行相应的处理 插件的结构一览： PluginsManager:插件管理类，实现插件功能的主要代码逻辑，以及对插件容器的维护 AssemblyLoader:插件加载类，实现从AppDomain加载插件的逻辑 PluginEntity:插件实体类，包含插件的信息(插件实例、插件名称……) AssemblyFactory:插件生成类，实现从插件代码生成dll的功能 下一篇日志中，将会介绍这个插件的具体配置，及简单分析其实现。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>Dynamic Plugins Manager是一个基于.NET的动态插件管理组件，也是我在业余时间做的一个小东东，代码在07年底就开始动工，因为一直没充裕时间完成，趁这个周末休息，加班加点的Coding，出来了一个原型，估计里面还有很多的显而易见的以及隐而未现的bug。<br />
  设计这个组件的初衷，是为了能方便的应用于今后的项目中。先进的企业级项目中，变化最为突出的，还是业务，业务的变化，直接导致编码中业务逻辑代码的变化。如果将这些业务逻辑混杂在一起，业务的变化，最终会导致代码的混乱，甚至难以维护。这对于一个长期迭代的项目来说，是相当痛苦的事。就像直接拿一个成千上万行的代码给开发人员，估计开发人员不是晕厥，就是吐血。而一个难以维护的业务逻辑代码，对于每一次迭代，都是一次冒险。很可能在某次的迭代中，会对以前的业务逻辑，产生影响或者风险。<br />
  对于复杂的业务逻辑，需要进行重构，并且将不断变化的业务逻辑，抽离出来。比较折中的方法，就是将这些变化的逻辑，做成独立的插件形式。这样一来，独立的业务，在物理上进行了分离。开发人员也不用担心修改某处业务逻辑，会影响其他的业务模块。而动态的插件管理形式，对后期维护也带来益处，独立的业务逻辑插件之间，不会相互影响。开发人员还可以在程序运行而又不影响业务的情况下，动态的发布、替换原有的业务逻辑模块。<br />
  Dynamic Plugins Manager(以下简称Plugins Manager)，也就是按照这样的思路和需求来设计的，其实现的功能，具体有一下几个特点：<br />
  1.所有的插件，都以DLL程序集的方式发布,Plugins Manager在启动的时候，搜索加载所有可加载的插件并进行加载<br />
  2.Plugins Manager，支持插件的动态卸载功能。借助于AppDomain的特性，所有的组件，在动态加载后，可以动态从内存中卸载。插件的实现，需要继承自MarshalByRefObject。<br />
  3.与接口无依赖性，Plugins Manager负责插件的管理、动态加载、动态卸载、调用。但是和具体的插件接口无关，这样一来，开发人员可以定义自己的插件接口，并开发不同的插件实现接口。<br />
  4.插件可以动态发布和卸载,Plugins Manager会监视当前目录中，插件的变化，对于以xcopy方式，拷贝入插件目录的插件，可以进行动态加载。对于插件的卸载，可以Plugins Manager提供的接口进行动态卸载，也可以实时更改插件配置文件中的具体开关进行卸载。<br />
  5.动态编译功能：Plugins Manager允许直接发布插件代码。通过读取插件配置文件中的引用信息，可以直接从代码生成dll插件，并加载。<br />
  6.允许插件实现不同的构造函数重载，并将构造函数参数以及值信息，定义在插件配置文件中。Plugins Manager在加载插件的时候，采用配置文件中的值，调用相应的构造函数，并加载插件。<br />
  7.事件通知：Plugins Manager在不同的插件操作完成后，会触发相应的事件机制，通知客户端程序进行相应的处理</p>
<p>  插件的结构一览：</p>
<p><img src="/pics/PluginManager/PluginManager.jpg" border="0" alt=""/></p>
<p>   PluginsManager:插件管理类，实现插件功能的主要代码逻辑，以及对插件容器的维护<br />
   AssemblyLoader:插件加载类，实现从AppDomain加载插件的逻辑<br />
   PluginEntity:插件实体类，包含插件的信息(插件实例、插件名称……)<br />
   AssemblyFactory:插件生成类，实现从插件代码生成dll的功能</p>
<p>  下一篇日志中，将会介绍这个插件的具体配置，及简单分析其实现。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-1-introduction-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Plugins Manager</title>
		<link>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2008-03-29.htm</link>
		<comments>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2008-03-29.htm#comments</comments>
		<pubDate>Sat, 29 Mar 2008 06:47:15 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[我的拙作]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[管理器]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=186</guid>
		<description><![CDATA[Dynamic Plugins Manager (一) 介绍 http://www.xiaozhou.net/article.asp?id=187 Dynamic Plugins Manager (二) 配置及实现分析 http://www.xiaozhou.net/article.asp?id=188 Dynamic Plugins Manager (三) Demo http://www.xiaozhou.net/article.asp?id=189 Dynamic Plugins Manager (四) 插件及Demo源码下载 http://www.xiaozhou.net/article.asp?id=190 Dynamic Plugins Manager (五) Plugins Manager 源码下载 http://www.xiaozhou.net/article.asp?id=191 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>Dynamic Plugins Manager (一) 介绍</p>
<p>http://www.xiaozhou.net/article.asp?id=187</p>
<p>Dynamic Plugins Manager (二) 配置及实现分析</p>
<p>http://www.xiaozhou.net/article.asp?id=188</p>
<p>Dynamic Plugins Manager (三) Demo</p>
<p>http://www.xiaozhou.net/article.asp?id=189</p>
<p>Dynamic Plugins Manager (四) 插件及Demo源码下载</p>
<p>http://www.xiaozhou.net/article.asp?id=190</p>
<p>Dynamic Plugins Manager (五) Plugins Manager 源码下载</p>
<p>http://www.xiaozhou.net/article.asp?id=191</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2008-03-29.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>动态加载并显示图片</title>
		<link>http://www.xiaozhou.net/vcdevelopment/dynamic-loading-and-explicit-pictures-2004-12-22.htm</link>
		<comments>http://www.xiaozhou.net/vcdevelopment/dynamic-loading-and-explicit-pictures-2004-12-22.htm#comments</comments>
		<pubDate>Wed, 22 Dec 2004 13:52:55 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[VC开发]]></category>
		<category><![CDATA[display]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[picture]]></category>
		<category><![CDATA[加载]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[显示]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=53</guid>
		<description><![CDATA[HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),&#8221;**.bmp&#8221;, IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION&#124;LR_LOADFROMFILE); if(hbitmap==NULL) return FALSE; CBitmap m_bitmap; m_bitmap.Attach(hbitmap); HBITMAP hbitmap; //先用上面的方法动态的装载位图,然后把图片显示到Static控件上 //获得指向静态控件的指针 CStatic *pStatic=(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得位图句柄 HBITMAP Bitmap; //设置静态控件的样式，使其可以使用位图，并试位标显示使居中 pStatic->ModifyStyle(0xF,SS_BITMAP&#124;SS_CENTERIMAGE); //设置静态控件显示位图 pStatic->SetBitmap(hBitmap); 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>HBITMAP hbitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),&#8221;**.bmp&#8221;, IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);<br />
if(hbitmap==NULL)<br />
return FALSE;<br />
CBitmap m_bitmap;<br />
m_bitmap.Attach(hbitmap);<br />
HBITMAP hbitmap;<br />
//先用上面的方法动态的装载位图,然后把图片显示到Static控件上<br />
//获得指向静态控件的指针<br />
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_SHOWBMP);<br />
//获得位图句柄<br />
HBITMAP Bitmap;<br />
//设置静态控件的样式，使其可以使用位图，并试位标显示使居中<br />
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);<br />
//设置静态控件显示位图<br />
pStatic->SetBitmap(hBitmap);</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/vcdevelopment/dynamic-loading-and-explicit-pictures-2004-12-22.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>动态加载位图</title>
		<link>http://www.xiaozhou.net/vcdevelopment/dynamic-loading-a-bitmap-2004-12-20.htm</link>
		<comments>http://www.xiaozhou.net/vcdevelopment/dynamic-loading-a-bitmap-2004-12-20.htm#comments</comments>
		<pubDate>Mon, 20 Dec 2004 08:33:54 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[VC开发]]></category>
		<category><![CDATA[bitmap]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[位图]]></category>
		<category><![CDATA[加载]]></category>
		<category><![CDATA[动态]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=50</guid>
		<description><![CDATA[void CCreateRandomBMPDlg::OnBtnTest() { // TODO: Add your control notification handler code here HBITMAP hBmp; CFileDialog dlg(TRUE, &#8220;bmp&#8221;, NULL, 0, &#8220;位图文件 (*.bmp)&#124;*.bmp&#124;&#124;&#8221;, this); if (dlg.DoModal() != IDOK) { return; } hBmp = (HBITMAP) LoadImage(NULL, dlg.GetPathName(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE &#124; LR_CREATEDIBSECTION); if (hBmp == NULL) { return; } BITMAP bm; PBITMAPINFO bmpInf; if (GetObject(hBmp, sizeof(bm), &#038;bm) [...]]]></description>
			<content:encoded><![CDATA[<p>void CCreateRandomBMPDlg::OnBtnTest()<br />
{<br />
	// TODO: Add your control notification handler code here<br />
	HBITMAP hBmp;</p>
<p>	CFileDialog dlg(TRUE, &#8220;bmp&#8221;, NULL, 0, &#8220;位图文件 (*.bmp)|*.bmp||&#8221;, this);</p>
<p>	if (dlg.DoModal() != IDOK)<br />
	{<br />
		return;<br />
	}</p>
<p>	hBmp = (HBITMAP) LoadImage(NULL, dlg.GetPathName(), IMAGE_BITMAP, 0, 0,<br />
						LR_LOADFROMFILE | LR_CREATEDIBSECTION);</p>
<p>	if (hBmp == NULL)<br />
	{<br />
		return;<br />
	}</p>
<p>	BITMAP bm;<br />
	PBITMAPINFO bmpInf;</p>
<p>	if (GetObject(hBmp, sizeof(bm), &#038;bm) == 0)<br />
		return ;</p>
<p>	int nPaletteSize = 0;</p>
<p>	if (bm.bmBitsPixel < 16)<br />
		nPaletteSize = (int) pow(2, bm.bmBitsPixel);</p>
<p>	bmpInf = (PBITMAPINFO) LocalAlloc(LPTR,<br />
							sizeof(BITMAPINFOHEADER) +<br />
							sizeof(RGBQUAD) * nPaletteSize);</p>
<p>	//-----------------------------------------------<br />
	bmpInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);<br />
	bmpInf->bmiHeader.biWidth = bm.bmWidth;<br />
	bmpInf->bmiHeader.biHeight = bm.bmHeight;<br />
	bmpInf->bmiHeader.biPlanes = bm.bmPlanes;<br />
	bmpInf->bmiHeader.biBitCount = bm.bmBitsPixel;<br />
	bmpInf->bmiHeader.biCompression = BI_RGB;<br />
	bmpInf->bmiHeader.biSizeImage = (bm.bmWidth + 7) /<br />
		8 * bm.bmHeight * bm.bmBitsPixel;<br />
	bmpInf->bmiHeader.biXPelsPerMeter = 0;<br />
	bmpInf->bmiHeader.biYPelsPerMeter = 0;<br />
	bmpInf->bmiHeader.biClrUsed = 0;<br />
	bmpInf->bmiHeader.biClrImportant = 0;<br />
	//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>	HDC hDC = ::GetWindowDC(NULL);<br />
	if (!::GetDIBits(hDC, hBmp, 0, (WORD) bm.bmHeight, NULL, bmpInf,<br />
			DIB_RGB_COLORS))<br />
	{<br />
		LocalFree(bmpInf);<br />
		::ReleaseDC(NULL, hDC);<br />
		return ;<br />
	}</p>
<p>	void* buf = (void*) new char[bmpInf->bmiHeader.biSizeImage];<br />
	if (buf == NULL)<br />
	{<br />
		::ReleaseDC(NULL, hDC);<br />
		LocalFree(bmpInf);<br />
		return ;<br />
	}</p>
<p>	if (!::GetDIBits(hDC, hBmp, 0, (UINT) bm.bmHeight, buf, bmpInf,<br />
			DIB_RGB_COLORS))<br />
	{<br />
		::ReleaseDC(NULL, hDC);<br />
		del&#101;te[]buf;<br />
		LocalFree(bmpInf);<br />
		return ;<br />
	}</p>
<p>	::ReleaseDC(NULL, hDC);</p>
<p>	CString sMsg;<br />
	sMsg.Format(&#8220;BitsPixel:%d,width:%d,height:%d&#8221;, bm.bmBitsPixel, bm.bmWidth,<br />
			bm.bmHeight);</p>
<p>	AfxMessageBox(sMsg);</p>
<p>	CClientDC dc(this);</p>
<p>	if (bm.bmBitsPixel == <img src='http://www.xiaozhou.net/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> 	{<br />
		BYTE* pData = (BYTE*) buf;</p>
<p>		int nWidth = bm.bmWidth;<br />
		while (nWidth % 4 != 0)<br />
		{<br />
			//Bmp每行数据都是4个字节的整数倍。<br />
			nWidth++;<br />
		}</p>
<p>		for (int i = 0; i < bm.bmHeight; i++)<br />
		{<br />
			for (int j = 0; j < bm.bmWidth; j++)<br />
			{<br />
				RGBQUAD rgbQ;<br />
				rgbQ = bmpInf->bmiColors[pData[i * nWidth + j]];<br />
				dc.SetPixel(j, bm.bmHeight &#8211; i,<br />
					RGB(rgbQ.rgbRed, rgbQ.rgbGreen, rgbQ.rgbBlue));<br />
			}<br />
		}<br />
	}<br />
	else if (bm.bmBitsPixel == 16)<br />
	{<br />
		BYTE* pData = (BYTE*) buf;</p>
<p>		int nWidth = bm.bmWidth*2;<br />
		while (nWidth % 4 != 0)<br />
		{<br />
			nWidth++;<br />
		}</p>
<p>		BYTE red, green, blue;</p>
<p>		for (int i = 0; i < bm.bmHeight; i++)<br />
		{<br />
			for (int j = 0; j < bm.bmWidth; j++)<br />
			{<br />
				blue = pData[i * nWidth + j * 2] &#038; 0x1F;<br />
				green = pData[i * nWidth + j * 2] >> 5;<br />
				green |= (pData[i * nWidth + j * 2 + 1] &#038; 0&#215;03) << 3;<br />
				red = (pData[i * nWidth + j * 2 + 1] >> 2) &#038; 0x1F;</p>
<p>				WORD wRed = red*8;<br />
				WORD wBlue = blue*8;<br />
				WORD wGreen = green*8;</p>
<p>				red = min(255, wRed);<br />
				blue = min(255, wBlue);<br />
				green = min(255, wGreen);</p>
<p>				dc.SetPixel(j, bm.bmHeight &#8211; i, RGB(red, green, blue));<br />
			}<br />
		}<br />
	}<br />
	else if (bm.bmBitsPixel == 24)<br />
	{<br />
		BYTE* pData = (BYTE*) buf;</p>
<p>		int nWidth = bm.bmWidth*3;<br />
		while (nWidth % 4 != 0)<br />
		{<br />
			nWidth++;<br />
		}</p>
<p>		for (int i = 0; i < bm.bmHeight; i++)<br />
		{<br />
			for (int j = 0; j < bm.bmWidth; j++)<br />
			{<br />
				dc.SetPixel(j, bm.bmHeight -<br />
					i,<br />
					RGB(pData[i * nWidth + j * 3 + 2],<br />
						pData[i * nWidth + j * 3 + 1],<br />
						pData[i * nWidth + j * 3]));<br />
			}<br />
		}<br />
	}<br />
	else if (bm.bmBitsPixel == 32)<br />
	{<br />
		BYTE* pData = (BYTE*) buf;</p>
<p>		int nWidth = bm.bmWidth*4;</p>
<p>		for (int i = 0; i < bm.bmHeight; i++)<br />
		{<br />
			for (int j = 0; j < bm.bmWidth; j++)<br />
			{<br />
				dc.SetPixel(j, bm.bmHeight -<br />
					i,<br />
					RGB(pData[i * nWidth + j * 4 + 2],<br />
						pData[i * nWidth + j * 4 + 1],<br />
						pData[i * nWidth + j * 4]));<br />
			}<br />
		}<br />
	}</p>
<p>	del&#101;te[]buf;</p>
<p>	DeleteObject(hBmp);<br />
	LocalFree(bmpInf);<br />
}</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/vcdevelopment/dynamic-loading-a-bitmap-2004-12-20.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>动态加载DLL</title>
		<link>http://www.xiaozhou.net/vcdevelopment/dynamically-loaded-dll-2004-10-26.htm</link>
		<comments>http://www.xiaozhou.net/vcdevelopment/dynamically-loaded-dll-2004-10-26.htm#comments</comments>
		<pubDate>Tue, 26 Oct 2004 04:16:32 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[VC开发]]></category>
		<category><![CDATA[dll]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[加载]]></category>
		<category><![CDATA[动态]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=35</guid>
		<description><![CDATA[核心代码片断： void CLoadLibraryTestDlg::OnLoad() { typedef int (WINAPI * MyFun)(HWND,LPCTSTR,LPCTSTR,UINT); MyFun fun=NULL; HINSTANCE hHandle; hHandle=LoadLibrary(&#8220;user32.dll&#8221;); fun=(int (WINAPI *)(HWND,LPCTSTR,LPCTSTR,UINT))::GetProcAddress(hHandle,&#8221;MessageBoxA&#8221;); if(fun!=NULL) { fun(NULL,&#8221;hahahahahahahaha&#8221;,&#8221;success &#8221;,MB_OK); } } 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space 并应以链接形式标明本文地址!]]></description>
			<content:encoded><![CDATA[<p>核心代码片断：</p>
<p>void CLoadLibraryTestDlg::OnLoad()<br />
{<br />
	typedef int (WINAPI * MyFun)(HWND,LPCTSTR,LPCTSTR,UINT);<br />
	MyFun fun=NULL;<br />
	HINSTANCE hHandle;<br />
	hHandle=LoadLibrary(&#8220;user32.dll&#8221;);<br />
	fun=(int (WINAPI *)(HWND,LPCTSTR,LPCTSTR,UINT))::GetProcAddress(hHandle,&#8221;MessageBoxA&#8221;);<br />
	if(fun!=NULL)<br />
	{<br />
		fun(NULL,&#8221;hahahahahahahaha&#8221;,&#8221;success <img src='http://www.xiaozhou.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8221;,MB_OK);<br />
	}<br />
}</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/vcdevelopment/dynamically-loaded-dll-2004-10-26.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

