<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>david_shar的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=david_shar</link>
<description>david_shar的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[.NET Windows编程系列(1)：.NET Windows编程概述]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39583</link>
<author>david_shar</author>
<pubDate>2008/9/4 21:45:47</pubDate>
<description><![CDATA[<STRONG><U>摘要：</U></STRONG> 
<P>从本系列开始，我们将给大家介绍.NET下使用VS.NET2005进行Windows应用程序开发的一些知识，包括windows窗体编程、VS2005常用控件、对话框和菜单编程、图像编程、文件和流、注册表等等。</P>
<P><U><STRONG>注：</STRONG></U>本系列节选自MSDN Webcasts上邵志东老师的《<A href="http://www.isheu.com/tag_157731_2_.NET+Windows%e7%bc%96%e7%a8%8b%e7%b3%bb%e5%88%97%e8%af%be%e7%a8%8b.aspx"><FONT color=#087da8> .NET Windows编程系列课程</FONT></A>》PPT内容，在<FONT color=#000000>我的Blog</FONT>中整理发表，方便大家一同参考！此系列相关资料请到<A href="http://www.isheu.com/data_2093_2.aspx" target=_blank><U><FONT color=#6466b3>这里</FONT></U></A>下载。</P>
<P><STRONG><U>本节主要内容：</U></STRONG></P>
<H1 style="FONT-SIZE: 12pt">Visual C# 2005 新增功能</H1>
<H1 style="FONT-SIZE: 10pt">Windows窗体编程</H1>
<H2 style="FONT-SIZE: 10pt">一、 Visual C# 2005 新增功能</H2>
<UL>
<LI>语言和编译器：C#2.0 语言支持泛型类型、迭代器和分部类型。 
<LI>代码编辑器 
<LI>开发环境 
<LI>文档和语言规范 
<LI>调试 </LI></UL>
<H3 style="FONT-SIZE: 10pt">代码编辑器</H3>
<H4 style="FONT-SIZE: 10pt">1.代码段</H4>
<P>通过提供可填写的模板，代码段加速了通用代码构造的输入。代码段存储为XML 文件，可轻松对其进行编辑和自定义。<BR>Visual Studio 提供了一项称为代码段的新功能。可以使用代码段键入短的别名，然后将其扩展为通用的编程构造。例如，for 代码段创建一个空的for循环。<BR>有些代码段为外侧代码段，这些代码段允许您先选择代码行，然后选择要并入选定代码行的代码段。例如，选择代码行，然后激活for 代码段，便可以创建一个for 循环，选定的这些代码行在该循环块内。代码段可以使程序代码的编写更快、更容易、更可靠<BR>代码段（code snippets）<BR>Hearder：包含以下子元素：<BR>Author：指定代码段的作者姓名<BR>Description：指定有关IntelliSense代码段内容的描述信息。<BR>HelpUrl：指定提供有关代码段的更多信息的URL。<BR>Keywords：为代码段指定自定义的关键字。<BR>Shortcut：指定用于插入代码段的快捷方式文本<BR>SnippetTypes：指定Visual Studio插入代码段的方式<BR>Title：指定代码段的标题。<BR>Snippet包含以下子元素：<BR>Code：提供用于容纳IntelliSense代码段的短代码段的容器<BR>Declarations：指定构成代码段可编辑部分的文本和对象。<BR>Imports：指定IntelliSense代码段使用的导入命名空间<BR>References：指定有关代码段所需的程序集引用的信息。</P>
<H4 style="FONT-SIZE: 10pt">2.扩充代码段</H4>
<P>在vs.net 2005 中默认的C#代码段不如VB.net的多，不过我们可以下载C#扩充代码段包：<A href="http://msdn2.microsoft.com/zh-cn/vstudio/aa718338.aspx" target=_blank><U><FONT color=#6466b3>下载地址</FONT></U></A> 。另外，还可以自定义编辑代码段，把自己常用的代码的程序段创建成代码段，那么以后就可以直接引用，提高我们的开发效率。Snippy-Visual Studio Code Snippets Editor C#的代码段编辑器：<A href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=b0813ae7-466a-43c2-b2ad-f87e4ee6bc39" target=_blank><U><FONT color=#6466b3>下载地址</FONT></U></A>。<BR>DEMO 1：代码段使用</P>
<H4 style="FONT-SIZE: 10pt">3.重构</H4>
<P>重构：重构工具可自动重新构造源代码，例如，通过将局部变量升级为参数或将代码块转换为方法。<BR>重构是在编写代码后在不更改代码的外部行为的前提下通过更改代码的内部结构来改进代码的过程。<BR>重构命令：重命名、提取方法、封装字段、提取接口、将局部变量提升为参数、移除参数、重新排列参数<BR>DEMO 2：重构</P>
<H3 style="FONT-SIZE: 10pt">开发环境</H3>
<P>IntelliSense：智能标记<BR>类设计器：提供了一个可视的设计图面（称为“类关系图”），可用于处理项目中的类和其他类型。类关系图中显示的元素对应于代码中的元素，因此类设计器为您提供了代码的可视化形式。<BR>对象测试工作台<BR>ClickOnce部署：ClickOnce部署允许您将Windows 应用程序发布到Web 服务器或网络文件共享上以简化安装<BR>DEMO 3：类设计器</P>
<H3 style="FONT-SIZE: 10pt">调试和运行</H3>
<P>以前版本调试时修改代码后要重新运行，有时重新运行后，执行到要调试的位置需要很复杂的操作或者很长的时间。编辑后运行可以让代码修改即时生效。进入调试状态：发生异常、手工中断运行或执行到自定义断点，托动黄色箭头可以改变语句运行顺序，注意：并非所有修改都可以继续运行。<BR>对象测试工作台<BR>对象测试工作台(OTB) 是为简单的对象级测试而设计的。<BR>使用OTB可以创建项目的对象实例、调用方法和计算结果。这样可以缩短编写代码、调试然后重新编写代码的任务。<BR>DEMO 4：编辑后继续运行和即时调试</P>
<H2 style="FONT-SIZE: 10pt">二、 Windows窗体编程</H2>
<H3 style="FONT-SIZE: 10pt">Windows窗体</H3>
<P>窗体是应用程序的基本单元。<BR>窗体实质上是一块空白板，作为开发人员，您可通过添加控件来创建用户界面，并通过编写代码来操作数据，从而填充这个空白板。<BR>Windows 窗体设计器为创建基于Windows 的应用程序提供了一种快速的开发解决方案。在该设计器中可以进行可视化的、基于客户端的窗体设计。可从“工具箱”中将控件拖动或绘制到其图面上。<BR>DEMO 5：计算器编写</P>
<H3 style="FONT-SIZE: 10pt">Windows窗体继承</H3>
<P>为什么要窗体继承？<BR>窗体也是类，所以能够被继承。通过继承窗体，可以使得应用的外表和行为一致。可以增强应用的维护性<BR>DEMO 6：窗体继承</P>]]></description>
</item><item>
<title><![CDATA[.NET Windows编程系列(2)：C#语法和面向对象编程]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39582</link>
<author>david_shar</author>
<pubDate>2008/9/4 21:38:26</pubDate>
<description><![CDATA[<A></A>
<P><STRONG><U>摘要：</U></STRONG></P>
<P>在本文中，我们侧重给大家介绍面向对象的编程思想和C#2.0中新增功能，让大家进一步掌握OOP编程内涵以及一些C#编程技巧。<BR><BR><U><STRONG>注：</STRONG></U>本系列节选自MSDN Webcasts上邵志东老师的《<A href="http://www.isheu.com/tag_157731_2_.NET+Windows%e7%bc%96%e7%a8%8b%e7%b3%bb%e5%88%97%e8%af%be%e7%a8%8b.aspx" target=_blank><U><FONT color=#6466b3> .NET Windows编程系列课程</FONT></U></A>》PPT内容，<FONT color=#000000>在我的Blog中</FONT>整理发表，方便大家一同参考！此系列相关资料请到<A href="http://www.isheu.com/data_2103_2.aspx" target=_blank><U><FONT color=#6466b3>这里</FONT></U></A>下载。<STRONG>&nbsp;</STRONG></P>
<P><STRONG><U>本节主要内容：</U></STRONG></P>
<H1>C#语法<BR><BR>C#面向对象编程<BR></H1>
<H2>一、C#语法</H2>
<UL>
<LI>数组 
<LI>委托 
<LI>可空类型 
<LI>泛型 </LI></UL>
<H3>数组</H3>
<H4>1.数组概述</H4>
<P>C# 数组从零开始建立索引，即数组索引从零开始。声明数组时，方括号([]) 必须跟在类型后面，而不是标识符后面。<BR>数组的大小不是其类型的一部分，数组使用需要初始化。<BR>例如：int[] numbers; numbers = new int[10]; numbers = new int[20]; <BR></P>
<H4>2.数组是对象</H4>
<P>在C# 中，数组实际上是对象。System.Array是所有数组类型的抽象基类型。<BR>可以使用System.Array具有的属性以及其他类成员。这种用法的一个示例是使用“长度”(Length)属性获取数组的长度。下面的代码将 numbers 数组的长度（为 5）赋给名为 LengthOfNumbers 的变量：<BR>int[] numbers = {1, 2, 3, 4, 5};<BR>int LengthOfNumbers = numbers.Length;<BR>System.Array类提供许多有用的其他方法/属性，如用于排序、搜索和复制数组的方法。</P>
<H4>3.多维数组</H4>
<P>使用多个下标访问其元素的数组。<BR>二维数组：平面上点的坐标pt(x,y)<BR>&nbsp; 声明：double[,] dbHeight=new double[3,4]; double[,] dbHeight={ {1,2,3,4},{2,3,4,5},{3,4,5,6} };</P>
<H4>4.数组的数组</H4>
<P>数组的每个元素是数组，声明方式int[][] arrayInt;<BR>方式一：<BR>arrayInt=new int[2][];//注意不能用<BR>arrayInt=new int[3][4]!<BR>arrayInt[0]=new int[3];<BR>arrayInt[1]=new int[4];<BR>方式二：arrayInt={new int[]{1,2,3,},new int[]{4,5,6,7}};</P>
<H4>5.参数数组</H4>
<P>参数的类型：值参数、引用参数、输出参数<BR>一种新类型的参数： 参数数组<BR>可以使用个数不定的参数调用函数，必须是参数定义中的最后一个参数，<BR>用关键字params说明，params参数必须是一维数组，例如：public void fun(params in[]args）<BR>DEMO1：数组练习</P>
<H3>委托</H3>
<H4>1.委托</H4>
<P>委托使用的目标：把函数作为参数传递，类似于C++中的函数指针。是事件处理的基础。<BR>委托是面向对象的、类型安全的和保险的。<BR>委托声明： delegate 函数返回类型名 委托名（函数参数）<BR>delegate double process(double db1); <BR>DEMO2：委托练习</P>
<H4>2.匿名方法</H4>
<P>匿名方法（anonymous methods）允许将与一个委托关联的代码“内联（in-line）”到使用委托的地方，我们可以很方便地将代码直接写在委托实例中。<BR>匿名方法还共享对本地语句所包含的函数成员的访问。要将代码块传递为委托参数，创建匿名方法则是唯一的方法。<BR></P>
<H3>可空类型</H3>
<P>可空类型表示可被赋值为null 值的值类型变量。无法创建基于引用类型的可空类型。（引用类型已支持null 值。）。<BR>语法T? 是System.Nullable&lt;T&gt; 的简写，此处的T 为值类型。这两种形式可以互换。<BR>为可空类型赋值与为一般值类型赋值的方法相同，如int? x = 10; 或double? d = 4.108;。<BR>如果基础类型的值为null，请使用System.Nullable.GetValueOrDefault属性返回该基础类型所赋的值或默认值，例如int j = x.GetValueOrDefault();<BR>请使用HasValue和Value 只读属性测试是否为空和检索值。可空类型变量的默认值将HasValue设置为false。未定义Value。<BR>使用?? 运算符分配默认值，当前值为空的可空类型被赋值给非空类型时将应用该默认值，如int? x = null; int y = x ?? -1;。<BR>不允许使用嵌套的可空类型。将不编译下面一行：Nullable&lt;Nullable&lt;int&gt;&gt; n;<BR>DEMO3：可空类型</P>
<H3>泛型</H3>
<P>泛型允许类、接口、结构、委托和方法通过它们所存储和操作的数据的类型来指定类型。<BR>这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。<BR>和使用object类相比，泛型降低了装箱和拆箱的负担，减少了类型转换所带来的错误<BR>使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。<BR>DEMO4：泛型示例</P>
<H2>二、C#面向对象编程</H2>
<H3>面向对象的程序设计</H3>
<H4>1.基本概念</H4>
<P>对象（object)：对象是面向对象开发方法的基本成分。每个对象可用它本身的一组属性和其上的一组操作来定义。<BR>类（Class)：类是一组具有相同数据结构和相同操作的对象的集合。类是对一系列具有相同性质的对象的抽象，是对对象共同特征的描述。<BR>继承（inheritance）：继承是使用已存在的定义作为基础建立新定义的技术新</P>
<H3>类</H3>
<H4>1.类的声明</H4>
<P>public class Test :object{ }</P>
<H4>2.类的成员有以下类型</H4>
<P>成员常量：代表与类相关联的常量值。<BR>域即类中的变量<BR>成员方法：负责执行类中的计算和其它操作<BR>属性：用于定义类中的值并对它们进行读写<BR>事件：用于说明发生了什么事情<BR>操作符：定义类中特有的操作<BR>构造函数和析构函数：分别用于对类的实例进行初始化和销毁修饰符类名基类类体</P>
<H4>3.类的成员</H4>
<P>共有（public）：允许类的使用者从外部进行访问<BR>保护（protected）：派生类可以访问<BR>私有（private）：仅限于类中的成员可以访问</P>
<H4>4、静态成员</H4>
<P>若将类中的某个成员声明为static 该成员称为静态成员。<BR>类中的成员要么是静态要么是非静态的。静态成员由类访问；非静态成员由对象访问。<BR>一般说来静态成员是属于类所有的非静态成员则属于类的实例——对象。<BR>静态方法为类所有，因此不要创建类的实例就可以调用。如System.math类。<BR>DEMO5：静态成员</P>
<H4>5.构造函数</H4>
<P>构造函数用于执行类的实例的初始化。<BR>每个类都有构造函数。即使我们没有声明它，编译器也会自动地为我们提供一个默认的构造函数。<BR>在访问一个类的时候，系统将最先执行构造函数中的语句。与类名相同的方法。<BR>构造函数可以重载（多个参数不同的构造函数）</P>
<H4>6.继承</H4>
<P>继承的基本概念C#中的继承符合下列规则：<BR>继承是可传递的。如果C 从B 中派生，B 又从A 中派生，那么C 不仅继承了B 中声明的成员，同样也继承了A 中的成员。Object 类作为所有类的基类。<BR>派生类应当是对基类的扩展。派生类可以添加新的成员，但不能除去已经继承的成员的定义。<BR>构造函数和析构函数不能被继承。除此以外的其它成员，不论对它们定义了怎样的访问方式，都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。<BR>类可以定义虚方法、虚属性以及虚索引指示器。它的派生类能够重载这些成员，从而实现类可以展示出多态性。</P>
<H4>7.多态</H4>
<P>虚函数：当类中的方法声明前加上了virtual 修饰符。我们称之为虚方法。反之为非虚。使用了virtual 修饰符后不允许再有static, abstract, 或override 修饰符。<BR>重载：在派生类中重新定义此虚函数时，要求的是方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载要求在声明中加上override 关键字，而且不能有new, static 或virtual 修饰符。<BR>DEMO6：多态性示例</P>
<H3>属性和索引指示器</H3>
<H4>1.属性</H4>
<P>属性是对现实世界中实体特征的抽象。它提供了对类或对象性质的访问。<BR>C#中的属性更充分地体现了对象的封装性：不直接操作类的数据内容，而是通过访问器进行访问。它借助于get 和set 对属性的值进行读写。</P>
<H4>2.索引指示器</H4>
<P>索引指示器（indexer） 使得可以像数组那样对对象使用下标。它为我们提供了通过索引方式方便地访问类的数据信息的方法。<BR>get 访问器返回值。set 访问器分配值。 this 关键字用于定义索引器。 value 关键字用于定义由set 索引器分配的值。<BR>索引器不必根据整数值进行索引，由您决定如何定义特定的查找机制。<BR>索引器可被重载。索引器可以有多个形参，例如当访问二维数组时。<BR>DEMO7：索引指示器</P>
<H3>命名空间</H3>
<P>.NET Framework 使用命名空间来组织它的众多类<BR>命名空间<BR>同类功能的类的集合。如System.Drawing中包含了各种绘图功能的类。名称空间是包含类的。<BR>Microsoft.VisualBasic.MyServices命名空间（Visual Basic 中的My）提供对许多.NET Framework 类的简单直观的访问，使您能够编写可与计算机、应用程序、设置、资源等交互的代码。虽然MyServices命名空间最初是为使用Visual Basic 而设计的，但它也可以在C# 应用程序中使用。<BR>DEMO8：使用My 命名空间</P>]]></description>
</item><item>
<title><![CDATA[BlogEngine.net 代码学习笔记]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39521</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:51:58</pubDate>
<description><![CDATA[<P><SPAN style="FONT-SIZE: 9pt; COLOR: teal">BlogProvider,BlogProviderCollection</SPAN>和blogprovidersection两个类用于定制提供程序</P>
<P>Blogservice类通过对他们的调用来实现对不同的提供程序使用一样的方法调用..</P>
<P>从web.config中读取以下内容</P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">BlogEngine</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">blogProvider</SPAN> <SPAN style="FONT-SIZE: 9pt; COLOR: red">defaultProvider</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">=</SPAN><SPAN style="FONT-SIZE: 9pt">"<SPAN style="COLOR: blue">XmlBlogProvider</SPAN>"<SPAN style="COLOR: blue">&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">providers</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">add</SPAN> <SPAN style="FONT-SIZE: 9pt; COLOR: red">name</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">=</SPAN><SPAN style="FONT-SIZE: 9pt">"<SPAN style="COLOR: blue">XmlBlogProvider</SPAN>" <SPAN style="COLOR: red">type</SPAN><SPAN style="COLOR: blue">=</SPAN>"<SPAN style="COLOR: blue">BlogEngine.Core.Providers.XmlBlogProvider</SPAN>"<SPAN style="COLOR: blue">/&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">add</SPAN> <SPAN style="FONT-SIZE: 9pt; COLOR: red">name</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">=</SPAN><SPAN style="FONT-SIZE: 9pt">"<SPAN style="COLOR: blue">MSSQLBlogProvider</SPAN>" <SPAN style="COLOR: red">type</SPAN><SPAN style="COLOR: blue">=</SPAN>"<SPAN style="COLOR: blue">BlogEngine.Core.Providers.MSSQLBlogProvider</SPAN>"<SPAN style="COLOR: blue">/&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">providers</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">blogProvider</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P style="TEXT-INDENT: 9pt"><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&lt;/</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">BlogEngine</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P style="TEXT-INDENT: 9pt">通过<SPAN style="FONT-SIZE: 9pt; COLOR: red">defaultProvider</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: red">得到提供程序</SPAN></P>
<P style="TEXT-INDENT: 9pt">由于使用了定制配置段，所以该段必须在使用前定义，还必须指定提供该定制段支持的类/类型。下面的代码列出了配置文件中完成这个操作所必需的项：</P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">configSections</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">sectionGroup</SPAN> <SPAN style="FONT-SIZE: 9pt; COLOR: red">name</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">=</SPAN><SPAN style="FONT-SIZE: 9pt">"<SPAN style="COLOR: blue">BlogEngine</SPAN>"<SPAN style="COLOR: blue">&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">section</SPAN> <SPAN style="FONT-SIZE: 9pt; COLOR: red">name</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">=</SPAN><SPAN style="FONT-SIZE: 9pt">"<SPAN style="COLOR: blue">blogProvider</SPAN>" <SPAN style="COLOR: red">requirePermission</SPAN><SPAN style="COLOR: blue">=</SPAN>"<SPAN style="COLOR: blue">false</SPAN>" <SPAN style="COLOR: red">type</SPAN><SPAN style="COLOR: blue">=</SPAN>"<SPAN style="COLOR: blue">BlogEngine.Core.Providers.BlogProviderSection, BlogEngine.Core</SPAN>" <SPAN style="COLOR: red">allowDefinition</SPAN><SPAN style="COLOR: blue">=</SPAN>"<SPAN style="COLOR: blue">MachineToApplication</SPAN>" <SPAN style="COLOR: red">restartOnExternalChanges</SPAN><SPAN style="COLOR: blue">=</SPAN>"<SPAN style="COLOR: blue">true</SPAN>"<SPAN style="COLOR: blue">/&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&nbsp;&nbsp;&nbsp; &lt;/</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">sectionGroup</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P style="TEXT-INDENT: 9pt"><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&lt;/</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: maroon">configSections</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">&gt;</SPAN></P>
<P style="TEXT-INDENT: 9pt"><SPAN style="FONT-SIZE: 9pt; COLOR: blue">BlogEngine.Core.Providers.BlogProviderSection, BlogEngine.Core</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: blue">是访问该段时的处理程序</SPAN></P>
<P style="TEXT-INDENT: 9pt"><SPAN style="FONT-SIZE: 9pt; COLOR: blue">然后需要建立这个类</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt; COLOR: blue">public</SPAN><SPAN style="FONT-SIZE: 9pt"> <SPAN style="COLOR: blue">class</SPAN> <SPAN style="COLOR: teal">BlogProviderSection</SPAN> : <SPAN style="COLOR: teal">ConfigurationSection</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">{</SPAN></P>
<P align=left></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: gray">///</SPAN> <SPAN style="COLOR: gray">&lt;summary&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: gray">///</SPAN><SPAN style="COLOR: green"> A collection of registered providers.</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: gray">///</SPAN> <SPAN style="COLOR: gray">&lt;/summary&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; [<SPAN style="COLOR: teal">ConfigurationProperty</SPAN>(<SPAN style="COLOR: maroon">"providers"</SPAN>)]</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">public</SPAN> <SPAN style="COLOR: teal">ProviderSettingsCollection</SPAN> Providers</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; {</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">get</SPAN> { <SPAN style="COLOR: blue">return</SPAN> (<SPAN style="COLOR: teal">ProviderSettingsCollection</SPAN>)<SPAN style="COLOR: blue">base</SPAN>[<SPAN style="COLOR: maroon">"providers"</SPAN>]; }</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; }</SPAN></P>
<P align=left></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: gray">///</SPAN> <SPAN style="COLOR: gray">&lt;summary&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: gray">///</SPAN><SPAN style="COLOR: green"> The name of the default provider</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: gray">///</SPAN> <SPAN style="COLOR: gray">&lt;/summary&gt;</SPAN></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; [<SPAN style="COLOR: teal">StringValidator</SPAN>(MinLength = 1)]</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; [<SPAN style="COLOR: teal">ConfigurationProperty</SPAN>(<SPAN style="COLOR: maroon">"defaultProvider"</SPAN>, DefaultValue = <SPAN style="COLOR: maroon">"XmlBlogProvider"</SPAN>)]</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">public</SPAN> <SPAN style="COLOR: blue">string</SPAN> DefaultProvider</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; {</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">get</SPAN> { <SPAN style="COLOR: blue">return</SPAN> (<SPAN style="COLOR: blue">string</SPAN>)<SPAN style="COLOR: blue">base</SPAN>[<SPAN style="COLOR: maroon">"defaultProvider"</SPAN>]; }</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">set</SPAN> { <SPAN style="COLOR: blue">base</SPAN>[<SPAN style="COLOR: maroon">"defaultProvider"</SPAN>] = <SPAN style="COLOR: blue">value</SPAN>; }</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp; }</SPAN></P>
<P align=left></P>
<P style="TEXT-INDENT: 9pt"><SPAN style="FONT-SIZE: 9pt">}</SPAN></P>
<P style="TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">上面的示例给出了实现定制段所需的最少代码。在建立简单定制提供程序的其他部分之前，需要注意两个事项：第一，注意类继承了ConfigurationSection。ConfigurationSection类是.NET 2.0中新增的，以前这是通过实现IConfigurationSectionHandler接口来完成的，而该接口已在.NET 2.0中废弃。</P>
<P style="TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">定制段处理程序现在可以以编程或声明实现方式来执行。上面的示例使用了声明方式，让框架(以及指定的特性)完成许多工作。例如，在建立ConfigurationProperty特性，指定名称如defaultProvider时，实现方式会把配置文件中的defaultProvider数据绑定到类属性上，且无需编写代码。第二，还要注意使用特性指定验证器的功能。这也有助于减少定制代码的数量，但仍具备以健全的方式进行验证的功能。</P>
<P style="TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&nbsp;<FONT face=Verdana>BlogEngine.net的完整代码可以从<FONT face=Verdana><A href="http://www.isheu.com/data_6780_1.aspx"><FONT color=#087da8><FONT face=Verdana>BlogEngine.net</FONT>.zip</FONT></A>获得</FONT></FONT></P>]]></description>
</item><item>
<title><![CDATA[浅谈BlogEngine扩展机制的实现]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39520</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:44:08</pubDate>
<description><![CDATA[在Blogengine里，每一个扩展的Class都必须有<STRONG>Extension</STRONG>标记<BR>ExtensionAttribute是一个密封类，继承自System.Attribute,System.Attribute没有任何实现，只是一个标记而已。<BR>ExtensionAttribute类的代码:(完整代码可以从<FONT face=Verdana><A href="http://www.isheu.com/data_6780_1.aspx"><FONT color=#087da8><FONT face=Verdana>BlogEngine.NET</FONT>.zip</FONT></A></FONT>下载)<BR>
<DIV class=dp-highlighter>
<DIV class=bar>
<DIV class=tools>&nbsp;</DIV></DIV>
<OL class=dp-c>
<LI class=alt>[AttributeUsage(AttributeTargets.Class)]&nbsp;&nbsp;<SPAN class=comment>//指明该Attrubite只能应用于Class上 </SPAN>&nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;<SPAN class=keyword>public</SPAN>&nbsp;<SPAN class=keyword>sealed</SPAN>&nbsp;<SPAN class=keyword>class</SPAN>&nbsp;ExtensionAttribute&nbsp;:&nbsp;System.Attribute &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;Creates&nbsp;an&nbsp;instance&nbsp;of&nbsp;the&nbsp;attribute&nbsp;and&nbsp;assigns&nbsp;a&nbsp;description. </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;/summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>public</SPAN>&nbsp;ExtensionAttribute(<SPAN class=keyword>string</SPAN>&nbsp;description,&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;version,&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;author) &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Description&nbsp;=&nbsp;description; &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Version&nbsp;=&nbsp;version; &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Author&nbsp;=&nbsp;author; &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>private</SPAN>&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;_Description; &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;Gets&nbsp;the&nbsp;description&nbsp;of&nbsp;the&nbsp;extension. </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;/summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>public</SPAN>&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;Description &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>get</SPAN>&nbsp;{&nbsp;<SPAN class=keyword>return</SPAN>&nbsp;_Description;&nbsp;} &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>private</SPAN>&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;_Version; &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;Gets&nbsp;the&nbsp;version&nbsp;number&nbsp;of&nbsp;the&nbsp;extension </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;/summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>public</SPAN>&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;Version &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>get</SPAN>&nbsp;{&nbsp;<SPAN class=keyword>return</SPAN>&nbsp;_Version;&nbsp;} &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>private</SPAN>&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;_Author; &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;Gets&nbsp;the&nbsp;author&nbsp;of&nbsp;the&nbsp;extension </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>///&nbsp;&lt;/summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>public</SPAN>&nbsp;<SPAN class=keyword>string</SPAN>&nbsp;Author &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>get</SPAN>&nbsp;{&nbsp;<SPAN class=keyword>return</SPAN>&nbsp;_Author;&nbsp;} &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;}&nbsp;&nbsp; </LI></OL></DIV><PRE class=c# id=6b4c5b45ab1340e099b418c6eb094ccd style="DISPLAY: none" name="6b4c5b45ab1340e099b418c6eb094ccd" cols="65" rows="12">[AttributeUsage(AttributeTargets.Class)]  //指明该Attrubite只能应用于Class上
public sealed class ExtensionAttribute : System.Attribute
{
/// &lt;summary&gt;
/// Creates an instance of the attribute and assigns a description.
/// &lt;/summary&gt;
public ExtensionAttribute(string description, string version, string author)
{
_Description = description;
_Version = version;
_Author = author;
}
private string _Description;
/// &lt;summary&gt;
/// Gets the description of the extension.
/// &lt;/summary&gt;
public string Description
{
get { return _Description; }
}
private string _Version;
/// &lt;summary&gt;
/// Gets the version number of the extension
/// &lt;/summary&gt;
public string Version
{
get { return _Version; }
}
private string _Author;
/// &lt;summary&gt;
/// Gets the author of the extension
/// &lt;/summary&gt;
public string Author
{
get { return _Author; }
}
}
</PRE>
<SCRIPT type=text/javascript>
dp.SyntaxHighlighter.ClipboardSwf = 'SyntaxHighlighter/Scripts/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('6b4c5b45ab1340e099b418c6eb094ccd');
</SCRIPT>
<BR>这个类非常之简单，只是一些描述性的信息，如作者、版本、描述等。<BR>到这里，ExtensionAttribute类就可以应用在任何一个Class上了<BR>看看mp3player.cs<BR>
<DIV class=dp-highlighter>
<DIV class=bar>
<DIV class=tools>&nbsp;</DIV></DIV>
<OL class=dp-c>
<LI class=alt><SPAN class=comment>///&nbsp;&lt;summary&gt; </SPAN>&nbsp;&nbsp; 
<LI class=""><SPAN class=comment>///&nbsp;增加flashMp3播放器 </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt><SPAN class=comment>///&nbsp;&lt;/summary&gt; </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">[Extension(<SPAN class=string>"mp3&nbsp;player"</SPAN>,&nbsp;<SPAN class=string>"1.0.0.0"</SPAN>,&nbsp;<SPAN class=string>"lemongtree.com"</SPAN>)]&nbsp;&nbsp;<SPAN class=comment>//此处给mp3player类打上Extension标记 </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt><SPAN class=keyword>public</SPAN>&nbsp;<SPAN class=keyword>class</SPAN>&nbsp;mp3player &nbsp;&nbsp;</SPAN> 
<LI class="">{ &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>public</SPAN>&nbsp;mp3player() &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Post.Serving&nbsp;+=&nbsp;<SPAN class=keyword>new</SPAN>&nbsp;EventHandler&lt;ServingEventArgs&gt;(Post_Serving); &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>private</SPAN>&nbsp;<SPAN class=keyword>void</SPAN>&nbsp;Post_Serving(<SPAN class=keyword>object</SPAN>&nbsp;sender,&nbsp;ServingEventArgs&nbsp;e) &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=comment>//此处略过 </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class=alt>}&nbsp;&nbsp; </LI></OL></DIV><PRE class=c# id=3fb32e875b1941c292ffd923807e9049 style="DISPLAY: none" name="3fb32e875b1941c292ffd923807e9049" cols="65" rows="12">/// &lt;summary&gt;
/// 增加flashMp3播放器
/// &lt;/summary&gt;
[Extension("mp3 player", "1.0.0.0", "lemongtree.com")]  //此处给mp3player类打上Extension标记
public class mp3player
{
public mp3player()
{
Post.Serving += new EventHandler&lt;ServingEventArgs&gt;(Post_Serving);
}
private void Post_Serving(object sender, ServingEventArgs e)
{
//此处略过
}
}
</PRE>
<SCRIPT type=text/javascript>
dp.SyntaxHighlighter.ClipboardSwf = 'SyntaxHighlighter/Scripts/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('3fb32e875b1941c292ffd923807e9049');
</SCRIPT>
<BR>mp3player就是一个针对于Post的扩展了。<BR>有朋友可能会问了:mp3player这个在什么时候实例化的呢？或是我如何得知这个扩展是不是Enable的呢?<BR>整个实例化的过程在global.asax的Application_Start事件中<BR>
<DIV class=dp-highlighter>
<DIV class=bar>
<DIV class=tools>&nbsp;</DIV></DIV>
<OL class=dp-c>
<LI class=alt>Assembly&nbsp;a&nbsp;=&nbsp;Assembly.Load(assemblyName); &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type[]&nbsp;types&nbsp;=&nbsp;a.GetTypes();&nbsp;&nbsp;&nbsp;<SPAN class=comment>//获取当前程序集中的所有类型 </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>foreach</SPAN>&nbsp;(Type&nbsp;type&nbsp;<SPAN class=keyword>in</SPAN>&nbsp;types) &nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>object</SPAN>[]&nbsp;attributes&nbsp;=&nbsp;type.GetCustomAttributes(<SPAN class=keyword>typeof</SPAN>(ExtensionAttribute),&nbsp;<SPAN class=keyword>false</SPAN>);&nbsp;&nbsp;&nbsp;<SPAN class=comment>//获取含有ExtensionAttribute标记的类 </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>foreach</SPAN>&nbsp;(<SPAN class=keyword>object</SPAN>&nbsp;attribute&nbsp;<SPAN class=keyword>in</SPAN>&nbsp;attributes) &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN class=keyword>if</SPAN>&nbsp;(ExtensionManager.ExtensionEnabled(type.Name)) &nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.CreateInstance(type.FullName);&nbsp;&nbsp;<SPAN class=comment>//创建实例 </SPAN>&nbsp;&nbsp;</SPAN> 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class=alt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; 
<LI class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; </LI></OL></DIV><PRE class=c# id=c4322b2125cd4712b2b97246a5765dc6 style="DISPLAY: none" name="c4322b2125cd4712b2b97246a5765dc6" cols="65" rows="12">Assembly a = Assembly.Load(assemblyName);
Type[] types = a.GetTypes();   //获取当前程序集中的所有类型
foreach (Type type in types)
{
object[] attributes = type.GetCustomAttributes(typeof(ExtensionAttribute), false);   //获取含有ExtensionAttribute标记的类
foreach (object attribute in attributes)
{
if (ExtensionManager.ExtensionEnabled(type.Name))
{
a.CreateInstance(type.FullName);  //创建实例
}
}
}
</PRE>
<SCRIPT type=text/javascript>
dp.SyntaxHighlighter.ClipboardSwf = 'SyntaxHighlighter/Scripts/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('c4322b2125cd4712b2b97246a5765dc6');
</SCRIPT>
<BR>到这里很明了了，扩展类决定于它有没有打Extension标记，是否创建实例取决于该扩展有没有被启用.<BR>BlogEngine有很多地方是值得我们学习的.]]></description>
</item><item>
<title><![CDATA[BlogEngine.net 学习笔记一：没有做不到,只有想不到]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39519</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:39:07</pubDate>
<description><![CDATA[<SPAN style="FONT-FAMILY: Arial">最近在园子溜达的时候发现了有人说BlogEngine.net 不错， 看了一下， <BR style="FONT-FAMILY: ">真的不错， 代码简洁， 功能不少， 真是麻雀虽小， 五脏俱全啊！！！<BR style="FONT-FAMILY: ">准备全程跟踪这个BlogEngine.net。BlogEngine.net可以从这里下载：<A href="http://www.isheu.com/data_6780_1.aspx"><FONT color=#087da8>BlogEngine.net.zip</FONT></A><BR style="FONT-FAMILY: ">下面写一些笔记：<BR style="FONT-FAMILY: "><IMG style="FONT-FAMILY: " height=325 alt="" src="http://images.cnblogs.com/cnblogs_com/jisiki/datamodule.JPG" width=667 border=0 twffan="done"><BR style="FONT-FAMILY: "><IMG style="FONT-FAMILY: " height=357 alt="" src="http://images.cnblogs.com/cnblogs_com/jisiki/EntityModule.JPG" width=706 border=0 twffan="done"><BR style="FONT-FAMILY: "><IMG style="FONT-FAMILY: " height=424 alt="" src="http://images.cnblogs.com/cnblogs_com/jisiki/PageCtrl.JPG" width=452 border=0 twffan="done"><BR style="FONT-FAMILY: "><IMG style="FONT-FAMILY: " height=148 alt="" src="http://images.cnblogs.com/cnblogs_com/jisiki/other.JPG" width=667 border=0 twffan="done"></SPAN>]]></description>
</item><item>
<title><![CDATA[Vista/XP Virtual Desktop Manager]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39518</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:31:33</pubDate>
<description><![CDATA[Vista的DWM桌面赋予程序开发员无限的想象力,Virtual Desktop Manager正是其中的一例,该软件可以实现虚拟桌面,并生成缩略图预览,这样您就可以将Vista改装成类似于Linux的桌面环境.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一版本同时支持Windows XP,但这样就没有DWM带来的各种效果了,本次更新带来了一些新功能和性能提升。安装文件可以从这里下载：<A href="http://www.isheu.com/data_4992_1.aspx"><FONT color=#087da8>Vista_XP Virtual <EM>Desktop Manager</EM>.msi&nbsp;</FONT></A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Features 如下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. Full screen desktop/window manager/preview with full drag and drop managing<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Desktop switch indicator<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. An infinite number of desktops<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. Watch the windows move in real time as you drag them around in the window manager<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. Multiple monitor support<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6. Window menus<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7. Tray icons for each desktop<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8. Per-desktop backgrounds<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9. Configurable colors, fade speeds, hotkeys, etc.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10. Uses Vista's live thumbnails<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11. XP support
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的快捷键：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Key + Z - 全频切换<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Key + W - Pop up the window menu for the active window<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Key + Numpad 1...9 - Switch to the corresponding desktop, if it exists<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Key + Arrow Keys - Move to the corresponding desktop<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Key + Control + Numpad 1...9 - Send the foreground window to the corresponding desktop<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows Key + Control + Arrow Keys - Send the foreground window to the corresponding desktop</FONT></P>]]></description>
</item><item>
<title><![CDATA[.NET Reflector Add-Ins简介]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39517</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:21:14</pubDate>
<description><![CDATA[
<P align=left><FONT face=#ce_temp_font#></FONT><FONT face=Verdana>.NET Reflector Add-Ins包含如下插件，可以从<FONT face=Verdana><A href="http://www.isheu.com/data_5023_1.aspx"><FONT color=#087da8><FONT face=Verdana>.NET Reflector Add-Ins</FONT>.zip</FONT></A>下载</FONT><BR><FONT face=Verdana>&nbsp; CodeMetrics: Analyses .NET assemblies and shows design quality metrics.<BR>&nbsp; Review: Allows editing and managing annotations during code reviews.<BR>&nbsp; Diff: This add-in shows differences between two versions of the same assembly.<BR>&nbsp; SilverlightLoader: Allows browsing the structure of a website and loading Silverlight assemblies.<BR>&nbsp; FileDisassembler: This add-in can be used to dump the disassembler output to files for any Reflector supported language.<BR>&nbsp; Reflexil: Allows to manipulate the IL of a loaded assembly, or inject VB.net/C# code, then write the changes to disk.<BR>&nbsp; BamlViewer: Load BAML resources (WPF) and render in XAML format.<BR>&nbsp; SilverlightBrowser: Loads and shows the files associated with a Silverlight website.<BR>&nbsp; ComLoader: Lists COM components for browsing and converts them into managed interop assemblies.<BR>&nbsp; SQL2005Browser: This add-in allows to browse .NET assemblies stored in SQL Server 2005 databases.<BR>&nbsp; FileGenerator: This add-in can be used to dump the disassembler output to files for any Reflector supported language.<BR>&nbsp; Deblector: This add-in allows to debug processes from within Reflector.<BR>&nbsp; Doubler: A code generator for unit tests, stubs and wrappers.<BR>&nbsp; Graph: This add-in draws assembly dependency graphs and IL graphs. Please read the install instructions here.<BR>&nbsp; BizTalkDisassembler: Allows you to list all BizTalk artifacts contained in an assembly and extract them.<BR>&nbsp; DependencyStructureMatrix: Allows you to create and browser dependency structure matrices.<BR>&nbsp; CodeSearch: This add-in allows searching for strings and regular expressions in disassembled code.<BR>&nbsp; RuleSetEditor: Editor for Windows Workflow Foundation rules.<BR>&nbsp; SequenceViz: This add-in draws sequence diagrams.<BR>&nbsp; AutoDiagrammer: This add-in draws class diagrams.<BR>&nbsp; Xmi4DotNet: Export an assembly to XMI/UML.<BR>&nbsp; AssemblyCollectionSort: Sorts the current assembly list alphabetically.<BR>&nbsp; Enums: Conversion of big flags and enum viewer.<BR>&nbsp; PowerShellLanguage: Renders output as Windows PowerShell script.<BR>&nbsp; DelphiLanguage: The Delphi view that is used inside .NET Reflector provided as a language add-in.<BR>&nbsp; CppCliLanguage: This add-in extends Reflector with a C++/CLI language rendering module.<BR>&nbsp; ReflectionEmitLanguage: This add-in renders C# code necessary to create the given IL body.<BR>&nbsp; TestDriven.net: This Visual Studio add-in can navigate to any code element inside Reflector with a single click.<BR>&nbsp; Hawkeye: A tool that allows you to debug the UI tree of Windows Forms applications.<BR>&nbsp; ClassView: Shows class definitions as plain text with color coding.<BR>&nbsp; CodeModelViewer: This add-in shows the underlying code model objects for selected items.</FONT></FONT></P>]]></description>
</item><item>
<title><![CDATA[AJAX Control Toolkit:图解Ajax Control Toolkit部署]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39516</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:06:54</pubDate>
<description><![CDATA[<P>要使用好Ajax.net，就要学会灵活运用Ajax.net所提供的Ajax Control Toolkit。该控件包提供了很多使用效果很炫的控件，有了它你能轻松打造一个Ajax网站。从本章开始，我们一起来学习怎样使用Ajax Cotrol Toolkit中的所有控件。</P>
<P><STRONG><FONT color=#003366>第一步：创建Ajax Toolkit模板</FONT></STRONG></P>
<P>大家应该有印象，当我们成功安装了Ajax扩展包之后，VS.net的模板中就多了一个Asp.net Ajax-Enabled Web Site的模板。它是微软的官方模板，而今天我们就要创建我们自己的Ajax Control Toolkit Web Site模板。</P>
<P>先在这里下载Ajax Control Toolkit:<A href="http://www.isheu.com/data_4991_1.aspx">Ajax Control Toolkit.zip</A></P>
<P>&nbsp;</P>
<P>下载之后解压到本地文件夹。双击AjaxControlToolkit.sln文件，选择“正常加载项目”。打开解决方案资源管理器之后我们能发现有很多个项目，而我们只需要重新生成一下TemplateVSI的Dll。生成之后TemplateVSI的bin文件夹就会多出如下文件。</P>
<P><IMG class=boxinner alt="" src="http://www.falaosao.net/attachments/month_0707/c2007721173054.jpg"></P>
<P>双击AjaxControlExtender.vsi就可以开始安装Ajax Control Toolkit模板了。中途遇到提示框选择重写名称即可。</P>
<P>完成之后打开VS.net 2005，我就能看到AJAX Control Toolkit Web Site模板了。</P>
<P><IMG class=boxinner alt="" src="http://www.falaosao.net/attachments/month_0707/92007721173434.jpg"></P>
<P><STRONG><FONT color=#003366>第二步：添加Ajax Control Toolkit</FONT></STRONG></P>
<P>建立网站后我们还不能在工具栏里看到Ajax.net的工具集，这需要我们自行添加。我们先在工具栏添加一个选项卡，命名为Ajax Control Toolkit或其他你喜欢的名字。然后在新的选项卡里单击右键，点击“选择项”-〉点击“浏览”-〉找到你刚才解压的文件夹，然后在SampleWebSite的bin文件夹里找到AjaxControlToolkit.dll，选择它，然后一路确定。这样就能把所有控件都添加你所添加的选项卡里了。</P>
<P><IMG class=boxinner alt="" src="http://www.falaosao.net/attachments/month_0707/42007721174138.jpg"></P>
<P><FONT color=#003366><STRONG>第三步：初试Ajax Control Toolkit</STRONG></FONT></P>
<P>到目前为止，Ajax Control Toolkit就部署完毕了，我们可以做一个简单的Demo看一看效果。</P>
<P>在工具栏里拖出一个Button控件，一个TextBox控件和一个Label控件。然后在Button的Click事件里写Label1.Text = TextBox1.Text; 这样当我们点击Button后，Label就会显示TextBox中的内容。</P>
<P>现在我们从Ajax Control Toolkit中拖出一个ConfirmButtonExtender控件，它的作用是能弹出确认窗口，点击确认才会继续执行下一步操作，否则则终止操作。</P>
<P>拖出后我们要设置ConfirmButtonExtender的TargetControlID属性，它关联的是控件ID，告诉ConfirmButtonExtender什么时候需要弹出确认窗口。我们在该属性的下拉菜单中选择Button1。</P>
<P>然后我们还需要设置确认窗口的提示语，该属性在Button的Extenders栏中，我们找到ContirmText，输入：你确认吗？</P>
<P>OK，运行！</P>
<P><IMG class=boxinner alt="" src="http://www.falaosao.net/attachments/month_0707/72007721175142.jpg"></P>
<P><FONT color=#003366><STRONG>结束：</STRONG></FONT></P>
<P>本章主要介绍了怎样部署Ajax Control Toolkit，并做了一个简单的例子。虽然该例子即使不使用Ajax Control Toolkit也能简单实现，但我只想告诉大家，使用Ajax Control Toolkit是多么的方便，以后将会陆续介绍其他更复杂，效果更炫的控件，敬请继续关注</P><A></A>]]></description>
</item><item>
<title><![CDATA[AJAX Control Toolkit:AJAX Control Toolkit 介绍及构建开发环境]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39515</link>
<author>david_shar</author>
<pubDate>2008/9/3 0:02:17</pubDate>
<description><![CDATA[<FONT face=Verdana>1 概述</FONT>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AJAX Control Toolkit 是由社区和 Microsoft 共同开发的一个 ASP.NET AJAX 扩展控件包，其中包含了数十种基于 ASP.NET AJAX 的、提供某一专一功能的服务端控件。构建在 ASP.NET 2.0 AJAX Extensions 之上，志在成为最大、最好的可用 Web 应用程序的组件集合。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Toolkit 解决了三个需要。首先，使网站开发人员有地方获取组件以更容易的构建他们的 Web 应用程序；第二，它给那些要编写客户端代码的人一个强大的示例集；第三，它是一个使最好的脚本开发人员使工作更加突出的地方。</FONT></P><FONT face=Verdana>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 AJAX Control Toolkit 的组成</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AJAX Control Toolkit 的最新下载可以从<A href="http://www.isheu.com/data_4991_1.aspx">AJAX Control Toolkit.zip</A> 得到。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AJAX Control Toolkit 的目录结构如下，在此介绍的是 .NET Framework 2.0 带源码的压缩包的目录结构：</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AjaxControlTooki： 此目录中包含了 AJAX Control Toolkit 中所有的源代码以及相应的 Visual Studio 项目文件。可以通过查看这些源代码来学习编写定制的 ASP.NET AJAX 控件，基于这些控件进行二次开发，或者改进这些控件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Binaries：一些辅助的 .NET 程序集，用于解决方案中其他项目。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleWebSite：AJAX Control Toolkit 的示例站点，也可以称为是其文档站点，其中示范了每个控件的使用以及包含了相关属性、方法等的说明。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ToolkitTests：此目录中包含了一个 Web 站点，该站点提供了一套测试框架，可以用来自动测试 Toolkit 中的现有控件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AjaxControlEntender： 目录中包含了一个 AjaxControlExtender.vsi 的 Visual Studio 安装文件，运行该文件并完成安装后，在 Visual Studio 项目模板中会添加一个 "ASP.NET AJAX Control" 类型的新项目，用于开发自己的的 ASP.NET AJAX 控件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TemplateVSI：目录中有一个 Visual Studio 项目，用于创建自定义控件的安装文件。</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 构造开发环境<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1 安装二进制文件</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载并安装最新的 ASP.NET AJAX Extensions 1.0 包；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载 AJAX Control Toolkit 压缩包并解压到计算机上的一个文件夹中。</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2 配置 Visual Studio 2005 和 Visual Web Developer</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建一个以 "ASP.NET AJAX-Enabled Web Site" 为模板的网站。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在工具箱上右单击“添加选项卡...”，添加一个名为“AJAX Control Toolkit”的选项卡。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在添加的选项卡上右单击，然后选择“添加项...”。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在出现的“选项工具箱项”对话框中，单击浏览按钮，导航到 AJAX Control Toolkit 解压的目录下的 SampleWebSite"bin 目录，选择“AjaxControlToolkit.dll”，单击“确定”来关闭选择工具箱项对话框。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此时，工具箱面板上就出现了所有的 AJAX Control Toolkit 中的所有控件。</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.3 配置 Web.config</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在将 AJAX Control Toolkit 的控件从工具箱中拖到页面上时，Visual Studio 会自动在每个页面中为程序集注册一个前缀 cc1，这样是非常麻烦的，解决的方法是在 Web.config 中为其注册一个有意义的前缀。在 Web.config 加入以下配置即可，这样就注册了一个前缀“ajaxToolkit”：</P>
<P>&nbsp;</P>
<P><FONT face=Verdana>system.web&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pages&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;controls&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add tagPrefix="ajaxToolkit" namespace="AjaxControlToolkit"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assembly="AjaxControlToolkit"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/controls&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/pages&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/system.web&gt;</FONT></P>
<P><FONT face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 总结<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AJAX Control Toolkit 是一个强大的扩展控件集，可以极大的方便开发人员开发各种具有 AJAX 特性的 Web 应用程序。同时构建它的开发环境也非常的简单。Microsoft 的东西都是比较方便的</FONT></P></FONT>]]></description>
</item><item>
<title><![CDATA[小议微软Codeplex最热门的25个.NET开源项目]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39488</link>
<author>david_shar</author>
<pubDate>2008/9/1 23:20:38</pubDate>
<description><![CDATA[<P>Bayarsaikhan向我们介绍了目前在微软<FONT color=#0066cc><A><FONT color=#0066cc>Codeplex</FONT></A></FONT>网站上最活跃的25个开源项目。通过这份列表，我们发现微软的程序员们的时间消费观念与世界上其它的Java程序员差不多:玩游戏，然后用AJAX把Web世界装扮一新。你可以在本文末Codeplex Tag云中查看自己最感兴趣的项目。</P>
<P>Codeplex吸引我的理由有很多，但最重要的一点是他将我讨论多年的一些事情变成了现实：基于Windows平台的开源项目对微软来说是一个极好的机会，即展开合作而不是熟视无睹。</P>
<P>并且他们看起来进行的不错（个人观点强于Sourceforge）：</P>
<P>Codeplex中的工程都是实际已经在进行的，其中不存在无数的孤立项目，即称之为“抛弃型开放源代码（主要表现形式为项目长期没有更新，没有缺陷报告和补丁发布，没有论坛或者是邮件列表活动，发给项目负责人的电子邮件通常来说有如泥牛入海。）”的项目。而不幸的是这正是Sourceforge的“特色”（Sourceforge上的大部分“工程”页面上什么都没有）。</P>
<P>就我来看，如Sourceforge类站点的优势在于它是一个集市，提供各种不同的、多样的开源项目。而Codeplex则类似于提供基于微软平台的开源项目的一站式的商店。如果微软平台没有如此高的知名度及普及度，那么这一切都是无趣的对比。在这里你可以方便的找到与微软项目的开源项目。</P>
<P>Codeplex要求其中的项目必须基于OSI(开放源代码促进会)认可的协议。Sourceforge也是如此（其中的一部分项目如此）。而我认为最重要的一点就是微软是其成为必要条件。而Codeplex则试图游离开源社区的规则。</P>
<P>那么让我们回过头看看Codeplex上最活跃项目的背景，如下方的tag云，其中的大部分都是稀奇古怪的底层玩意（Web脚本语言的扩展、框架等）。</P>
<P align=center><A href="http://www.codeplex.com/"><IMG alt=Codeplex网站上最热门的25个开源项目 hspace=0 src="http://img.article.pchome.net/00/23/97/92/101s.JPG" align=baseline border=0></A></P>
<P align=left>嗯，其中最大的一个就是Sharepoint。我已经就Sharepoint的潜在危险警告过最终用户，但开发者们显然对此视而不见。</P>
<P align=left>&nbsp;</P>
<P align=left>以下是我在这25个最受欢迎的项目中最喜欢的：</P>
<P align=left><STRONG><A title=Vista href="http://software.pchome.net/vista/" target=_blank><FONT color=#0066cc><A href="http://www.isheu.com/data_5225_1.aspx"><STRONG><A title=Vista href="http://software.pchome.net/vista/" target=_blank><FONT color=#0066cc>Vista</FONT></A> Battery Saver(Vista电池节能器)</STRONG></A></FONT></A></STRONG>－通过Vista的一项特性来禁止<A title=CPU href="http://hardware.pchome.net/cm/" target=_blank><FONT color=#0066cc>CPU</FONT></A>负荷，最多可以延长你的电池寿命达70%的小程序。</P>
<P align=left>&nbsp;</P>
<P align=left><A href="http://www.isheu.com/data_5225_1.aspx">下载</A></P>
<P align=left>&nbsp;</P>
<P align=left><STRONG><A href="http://www.isheu.com/data_5266_1.aspx"><STRONG>Community Kit for SharePoint（SharePoint社区开发工具包）</STRONG></A></STRONG>－一整套包含最佳实例、模版、Web部分，工具及源代码的，可以让任何人创建基于SharePoint技术的用于讨论任何话题的社区式Web站点（这也是Drupal等感兴趣的领域，简化内容管理系统）。</P>
<P align=left>&nbsp;</P>
<P align=left><A href="http://www.isheu.com/data_5266_1.aspx">下载</A></P>
<P align=left>&nbsp;</P>
<P align=left><STRONG><A href="http://www.isheu.com/data_5046_1.aspx"><STRONG>Facebook Developer Toolkit （Facebook开发工具箱）</STRONG></A></STRONG>－当我对怎样及为什么使用Facebook毫无头绪时，这个项目告诉了我，他包含面向Facebook的已封装的.Net API，这可以为Facebook平台编写应用程序的开发者提供极大的便利。</P>
<P align=left>微软已经放下身段为开发者们提供了聚会的场所（即Codeplex网站），而Codeplex看起来在基于微软平台的开源项目开发上做的不错。</P>
<P align=left>&nbsp;</P>
<P align=left><A href="http://www.isheu.com/data_5046_1.aspx">下载</A></P><A></A>]]></description>
</item><item>
<title><![CDATA[Ajax与Atlas开发系列课程(MSDN Webcast)大全]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=david_shar&amp;id=39487</link>
<author>david_shar</author>
<pubDate>2008/9/1 23:19:17</pubDate>
<description><![CDATA[
<P><A href="http://www.isheu.com/data_1091_2.aspx">Ajax与Atlas开发系列课程(4)：网页中的AJAX应用（一）.zip</A></P>
<P>讲座内容：本课介绍了使用AJAX实现在网页中实现应用的基本方法，通过Ajax在浏览器中实现MVC架构，即实现应用与显示模式分离。本课分为两讲，上着重介绍在网页中实现表示层的逻辑。下着重介绍在网页中实现业务逻辑，并介绍表示层如何与业务逻辑进行通信。通过本课程的学习，开发者可以在网页中设计基于MVC... </P>
<P><A href="http://www.isheu.com/data_1092_2.aspx">Ajax与Atlas开发系列课程(5)：网页中的AJAX应用（二）.zip</A></P>
<P>讲座内容：本课介绍了使用AJAX实现在网页中实现应用的基本方法，通过Ajax在浏览器中实现MVC架构，本课主要介绍表示层的应用特性，主要是一些Ajax页面用控件，Ajax的实体模型，以及Ajax的三层架构的访问技巧。课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MSDN特邀讲师北... </P>
<P><A href="http://www.isheu.com/data_1094_2.aspx">Ajax与Atlas开发系列课程(7)：服务器端的AJAX应用(二).zip</A> </P>
<P>讲座内容：本科介绍了AJAX在服务器端的基本实现方法课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MSDN特邀讲师北京工业大学软件工程硕士，微软MSDN特约讲师。曾于微软亚洲工程院MSN组工作，现任中国网通四分公司技术支持与项目部开发经理。具有多年电信系统与OA系统实施经验。 ... </P>
<P><A href="http://www.isheu.com/data_1087_2.aspx">Ajax与Atlas开发系列课程(1)：AJAX简介与web2.0.zip</A> </P>
<P>讲座内容：本课程介绍 Ajax技术的背景以及目前的应用概述，着重于介绍Ajax技术的一些概念，以及目前网络上广泛使用的Ajax技术架构概述。通过本课的学习可以让听众对Ajax概念有一个了解，并为后续课程中介绍Ajax开发提供概念铺垫。课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MS... </P>
<P><A href="http://www.isheu.com/data_1089_2.aspx">Ajax与Atlas开发系列课程(2)：Ajax开发介绍.zip</A> </P>
<P>讲座内容：本课程介绍AJAX开发所需要使用的技术，包括Ajax需要使用的xmlhttp.javascript、dom以及xml对象，简单的通过一到两个实例的开发介绍一下Ajax的开发过程。并让用户熟悉一下现在的Ajax产品课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MSDN特邀讲师... </P>
<P><A href="http://www.isheu.com/data_1093_2.aspx">Ajax与Atlas开发系列课程(6)：服务器端的AJAX应用（一）.zip</A> </P>
<P>讲座内容：本课介绍了AJAX在服务器端的基本实现方法课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MSDN特邀讲师北京工业大学软件工程硕士，微软MSDN特约讲师。曾于微软亚洲工程院MSN组工作，现任中国网通四分公司技术支持与项目部开发经理。具有多年电信系统与OA系统实施经验。 ... </P>
<P><A href="http://www.isheu.com/data_1088_2.aspx">Ajax与Atlas开发系列课程(13)：ASP.NET AJAX的发展与应用.zip</A> </P>
<P>讲座内容：这节课程作为ASP.NET AJAX的综合评述，介绍Atlas更名为ASP.NET AJAX以后的一些变化以及当前版本如何和ASP.NET 2.0整合使用课程讲师：陈黎夫 MSDN特邀讲师微软公司Atlas创始团队——Windows Live Hotmail的软件开发工程师... </P>
<P><A href="http://www.isheu.com/data_1090_2.aspx">Ajax与Atlas开发系列课程(3)：AJAX的设计目标.zip</A></P>
<P>讲座内容：介绍AJAX实现的服务器应用，包括服务器端通过Ajax实现的mvc架构，第三方的Ajax的类库和实现架构。通过本课的学习，用户可以了解到目前广为流传的几个AJAX架构的使用方法，并可以选择一种适合自己的开发架构进行AJAX的程序设计。课程讲师：苏鹏 中国网通技术支持与项目部开发... </P>
<P><A href="http://www.isheu.com/data_1095_2.aspx">Ajax与Atlas开发系列课程(8)：设计高质量的Ajax应用.zip</A> </P>
<P>讲座内容： Ajax开发中性能非常重要，本课通过介绍一些技巧，实现缩短响应时间，提高并发响应度，制作高质量的Ajax应用程序课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MSDN特邀讲师北京工业大学软件工程硕士，微软MSDN特约讲师。曾于微软亚洲工程院MSN组工作，现任中国网通四分... </P>
<P><A href="http://www.isheu.com/data_1096_2.aspx">Ajax与Atlas开发系列课程(9)：Altas中的Javascript.zip</A> </P>
<P>讲座内容：介绍Ajax的实现架构中最重要的一种altas架构。本课主要介绍一些入门的altas知识和技巧，通过本课的学习，听众可以掌握altas的基本调用方法。课程讲师：苏鹏 中国网通技术支持与项目部开发经理 MSDN特邀讲师北京工业大学软件工程硕士，微软MSDN特约讲师。曾于微软亚... </P>]]></description>
</item>
</channel>
</rss>