<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Loning's home</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/33293/rss</id><updated>2011-12-24T14:10:21Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33293/rss"/><entry><id>http://www.cnblogs.com/loning/archive/2011/05/14/2046376.html</id><title type="text">手机跨平台方案介绍</title><summary type="text">引述 现在手机平台种类繁多，主流平台有Symbian、IOS、Android、WM6.5、WP7以及中国山寨机所普遍使用的MTK，展讯， MSTAR。 作为开发者来说，特别是学生，要做一款软件支持如上平台，实在是一件遥不可及的事情。 不同种类的应用，成功的条件是不同的。有些应用是以质取胜的，有些应用则在质的同时必须要有足够的用户群（如LBS应用相关），也就是量的优势。因此，不同应用对于多平台支持的需求是有差异的，这也是本文探讨如何跨平台开发的价值所在。 跨平台开发有许多种方式，在文献中可查到有下列方式。方案名称简述特点性能方案开发难度使用难度使用成本案例动态脚本使用脚本语言进行动态载入或对特定</summary><published>2011-05-14T08:48:00Z</published><updated>2011-05-14T08:48:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2011/05/14/2046376.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2011/05/14/2046376.html"/><content type="html">&lt;div&gt;&#xD;
&lt;p style="text-align: left;"&gt;&lt;span style="font-size: 28px; font-weight: bold; line-height: 42px;"&gt;引述&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;现在手机平台种类繁多，主流平台有Symbian、IOS、Android、WM6.5、WP7以及中国山寨机所普遍使用的MTK，展讯， MSTAR。&lt;/p&gt;&#xD;
&lt;p&gt;作为开发者来说，特别是学生，要做一款软件支持如上平台，实在是一件遥不可及的事情。&lt;/p&gt;&#xD;
&lt;p&gt;不同种类的应用，成功的条件是不同的。有些应用是以质取胜的，有些应用则在质的同时必须要有足够的用户群（如LBS应用相关），也就是量的优势。因此，不同应用对于多平台支持的需求是有差异的，这也是本文探讨如何跨平台开发的价值所在。&lt;/p&gt;&#xD;
&lt;p&gt;跨平台开发有许多种方式，在文献中可查到有下列方式。&lt;/p&gt;&#xD;
&lt;table width="558" cellpadding="0" cellspacing="0" border="1"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="29"&gt;&#xD;
&lt;p&gt;方案名称&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="170"&gt;&#xD;
&lt;p&gt;简述&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;特点&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="19"&gt;&#xD;
&lt;p&gt;性能&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="57"&gt;&#xD;
&lt;p&gt;方案开发难度&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="26"&gt;&#xD;
&lt;p&gt;使用难度&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="22"&gt;&#xD;
&lt;p&gt;使用成本&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="160"&gt;&#xD;
&lt;p&gt;案例&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="29"&gt;&#xD;
&lt;p&gt;动态脚本&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="170"&gt;&#xD;
&lt;p&gt;使用脚本语言进行动态载入或对特定的数据格式进行解析，类似于浏览器工作方式：&lt;/p&gt;&#xD;
&lt;p&gt;wml&lt;/p&gt;&#xD;
&lt;p&gt;javascript&lt;/p&gt;&#xD;
&lt;p&gt;xml表单&lt;/p&gt;&#xD;
&lt;p&gt;私有数据格式&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;开发快，灵活配置。性能差，表现形式有限&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="19"&gt;&#xD;
&lt;p&gt;30&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="57"&gt;&#xD;
&lt;p&gt;40&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="26"&gt;&#xD;
&lt;p&gt;30&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="22"&gt;&#xD;
&lt;p&gt;40&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="160"&gt;&#xD;
&lt;p&gt;msn/fetion/qq 内置wap浏览器使用服务器把网页转换成wml，客户端进行解析展示。&lt;/p&gt;&#xD;
&lt;p&gt;移动MM使用xml进行界面定义&lt;/p&gt;&#xD;
&lt;p&gt;微软oneapp 使用 java script进行服务武器编写，客户端进行展示和交互&lt;/p&gt;&#xD;
&lt;p&gt;很多电子阅读软件都使用自有的格式在服务器端进行编写，客户端进行展示&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="29"&gt;&#xD;
&lt;p&gt;私有跨平台&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="170"&gt;&#xD;
&lt;p&gt;公司内部使用，进行很"粗略"的封装&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;使用范围受限&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="19"&gt;&#xD;
&lt;p&gt;90&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="57"&gt;&#xD;
&lt;p&gt;120&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="26"&gt;&#xD;
&lt;p&gt;70&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="22"&gt;&#xD;
&lt;p&gt;60&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="160"&gt;&#xD;
&lt;p&gt;不公开的内部引擎，比如Gameloft的游戏引擎&lt;/p&gt;&#xD;
&lt;p&gt;很多公司的UI引擎&lt;/p&gt;&#xD;
&lt;p&gt;针对特殊的领域，比如Poc（按键通话对讲机）引擎&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="29"&gt;&#xD;
&lt;p&gt;抽象中间件&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="170"&gt;&#xD;
&lt;p&gt;有自己的编程标准，完善的文档和规范化的接口&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;学习成本高,使用平台所限，在不损失性能得前提下解决特定的问题&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="19"&gt;&#xD;
&lt;p&gt;85&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="57"&gt;&#xD;
&lt;p&gt;300&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="26"&gt;&#xD;
&lt;p&gt;100~150&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="22"&gt;&#xD;
&lt;p&gt;50&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="160"&gt;&#xD;
&lt;p&gt;Nokia的Qt&lt;/p&gt;&#xD;
&lt;p&gt;沃勤的 mtk中间件&lt;/p&gt;&#xD;
&lt;p&gt;Brew 开发接口&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="29"&gt;&#xD;
&lt;p&gt;虚拟机&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="170"&gt;&#xD;
&lt;p&gt;使用字节码解析执行&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;开发容易，跨平台性好，但性能差,扩展难,维护成本高&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="19"&gt;&#xD;
&lt;p&gt;50&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="57"&gt;&#xD;
&lt;p&gt;有开源方案，自己开发成本很高&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="26"&gt;&#xD;
&lt;p&gt;60&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="22"&gt;&#xD;
&lt;p&gt;60&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="160"&gt;&#xD;
&lt;p&gt;标准的j2me虚拟机&lt;/p&gt;&#xD;
&lt;p&gt;开源的llvm, eve, flash最新版使用llvm&lt;/p&gt;&#xD;
&lt;p&gt;私有的，掌上明珠自己开发了虚拟机用于开发游戏&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="29"&gt;&#xD;
&lt;p&gt;代码转换&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="170"&gt;&#xD;
&lt;p&gt;使用java转换成c代码，再编译执行&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="76"&gt;&#xD;
&lt;p&gt;使用标准j2me接口开发，一份代码，好维护，但目前还没官方公开版&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="19"&gt;&#xD;
&lt;p&gt;84&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="57"&gt;&#xD;
&lt;p&gt;300&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="26"&gt;&#xD;
&lt;p&gt;60&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="22"&gt;&#xD;
&lt;p&gt;70&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="160"&gt;&#xD;
&lt;p&gt;棱镜方案&lt;/p&gt;&#xD;
&lt;p&gt;Fetion 3.0&lt;/p&gt;&#xD;
&lt;p&gt;正在开发的联通应用商店&lt;/p&gt;&#xD;
&lt;p&gt;目前都还是公司内部使用&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;备注:&lt;/p&gt;&#xD;
&lt;p&gt;性能:我们以纯本地代码开发出来的程序性能为100做基数,其他使用相对百分比&lt;/p&gt;&#xD;
&lt;p&gt;难度:我们以纯本地代码开发的难度100做基数,其他使用相对百分比&lt;/p&gt;&#xD;
&lt;p&gt;棱镜方案&#xD;
由北京创世互动 总经理 张盛毅 介绍，目前仅在北京创世互动公司内部使用，期待尽快与众多开发者见面&lt;/p&gt;&#xD;
&lt;p&gt;(1)&lt;/p&gt;&#xD;
&lt;p&gt;我们可以看到，使用动态脚本、虚拟机及代码转换等方式是比较廉价的跨平台开发方式。接下来本文将会介绍几种跨平台方式下进行跨平台开发的方案。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;动态脚本&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在比较火使用动态脚本的跨平台开发方案大部分是即基于HTML5的。事实上即对传统浏览器的一种扩展，提供了离线浏览功能、对本地设备的访问功能等。但由于大部分编码是使用脚本语言，因此性能较低。如果做图片处理等应用，则缺少相应成熟库支持。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;RhoMobile - one codebase, every&#xD;
smartphone&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;基于HTML5及Ruby构建跨平台应用的工具，号称支持iPhone, Windows Mobile,&#xD;
RIM, Symbian and Android。同时提供开发、同步、源码管理等全方位产品。具有IDE。&lt;/p&gt;&#xD;
&lt;p&gt;然而，当仔细看开发文档的时候，发现对Symbian提都不提了，实在是一件让我的N95伤心的事情&lt;a href="http://docs.rhomobile.com/rhodes/introduction"&gt;http://docs.rhomobile.com/rhodes/introduction&lt;/a&gt;&#xD;
。况且作者对Ruby了解甚少，也就没有进一步尝试。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Appcelerator&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Appcelerator的Titanium是使用HTML、JavaScript及CSS等Web技术构建移动（iPhone、Android及iPad）与桌面（Windows、OS X及Linux）应用的平台。此外，还可以使用Python、PHP及Ruby构建Titanium的桌面应用。这些应用还可以交叉编译到所有的目标平台上。&amp;nbsp;(2)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;PhoneGap&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;PhoneGap是一款开源的手机应用开发平台，它仅仅只用HTML和JavaScript语言就可以制作出能在多个移动设备上运行的应用。PhoneGap将移动设备本身提供的复杂的API进行了抽象和简化，提供了一系列丰富的API供开发者调用，只要你会HTML和Javascript或者Java语言，就可以利用PhoneGap提供的API去调用各种功能，PhoneGap就能让你可以制作出在各种手机平台上运行的应用，这对移动应用开发者来说无疑是个福音。&amp;nbsp;(3)&lt;/p&gt;&#xD;
&lt;p&gt;这个对Symbian的支持也很不好，官方的Symbian demo在我的N95上无法跑。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;代码转换&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;由于代码转换直接生成目标平台的应用程序，因此效率比较高。然而如引文中提到的，大部分项目都是私有的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;MoSync&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MoSync是一个开源的C/C++的集成开发环境。可以简化移动开发程序的开发难度，并且能够大大提高移动程序开发人员的工作效率。其主要优点：开源，跨平台android, j2me, Symbian等，易于移植。&amp;nbsp;(4)&lt;/p&gt;&#xD;
&lt;p&gt;官方的DEMO很成功的在我的手机上跑了起来，还有几个是OPENGL的。不过极其不爽的是，对中文的支持性很糟糕。MoSync所提供的UI系统压根没考虑对中文的支持，有国人问如何显示中文，MoSync的回复让我感到很雷，要制作一个一个byte的中文字符字体。难道他们以为汉字是拼音么。&lt;/p&gt;&#xD;
&lt;p&gt;不过MoSync正在做native ui的相关工作，不过，恐怕还需要相当长的时间来发展。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;虚拟机&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我认为虚拟机其实是很尴尬的，对多平台的支持远不如上文提到的几个强悍，编码过程中要考虑的也比较多。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;J2ME&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IPHONE压根不支持。Android则自己搞了套，估计合理利用设计模式，改动也不需要太大。Symbian还是对这个很友好的，WM6.5要装虚拟机，WP7未知。&lt;/p&gt;&#xD;
&lt;p&gt;在编码过程中，由于J2ME也没有为多种设备提供一个十分统一的访问方式(如加速度传感器等)，所以需要考虑的事情也比较多。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Silverlight、MonoDroid、 MonoTouch&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个就压根谈不上跨平台了，UI都是要各自写一套，而且后两者也特别臃肿。&lt;/p&gt;&#xD;
&lt;p&gt;值得一提的是，有个基于C#的游戏引擎delta engine，可以在PC、WP7、Android及iphone上跑。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Skyengine&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里介绍一下这个，其实也是最近斯凯的老大宋涛来我们天大才听说的。之前对山寨机一直没有关注过。&lt;/p&gt;&#xD;
&lt;p&gt;斯凯SDK处理了MTK，展讯， MSTAR平台的差异性，封装了统一、易用、功能强大的API。&#xD;
功能涵盖了图形文字处理，声音，文件IO，&#xD;
网络通信等；同时完美支持THUMB指令，插件机制，&#xD;
图形加速等高级特性。&#xD;
斯凯SDK将使你轻松开发出优秀的OTA应用。&lt;/p&gt;&#xD;
&lt;p&gt;开完会后过去聊，说已经放出Android的来了，但是后来在斯凯的网站找也没找到。估计还在内部测试，不过如果要做山寨机的平台的话，可能用这个会速度好多。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;扯这么多，最后也没扯出个真正的Write once，run anywhere的巨无霸。开发过程中，应该有机的选择几种跨平台技术，覆盖自己所关注的平台。&lt;/p&gt;&#xD;
&lt;p&gt;我们的团队近期在做一些个项目，也还在讨论跨平台的方案。我们还是比较关注手机程序的Native特性的。譬如Symbian用户更喜欢sis，而不喜欢jar。&lt;/p&gt;&#xD;
&lt;p&gt;总而言之，跨平台远没想象中的那样靠谱。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;引用作品&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1. &lt;b&gt;一尘.&lt;/b&gt; 手机跨平台开发五大方案对比. 博客园. [联机]&#xD;
 http://www.cnblogs.com/wmj/archive/2010/11/29/1891086.html.&lt;/p&gt;&#xD;
&lt;p&gt;2. &lt;b&gt;InfoQ.&lt;/b&gt;&#xD;
 Aptana被Appcelerator收购. [联机]&#xD;
 http://www.infoq.com/cn/news/2011/01/aptana-appcelerator.&lt;/p&gt;&#xD;
&lt;p&gt;3. 跨平台开发：初探PhoneGap移动开发框架. [联机] http://mobile.51cto.com/android-229213.htm.&lt;/p&gt;&#xD;
&lt;p&gt;4. &lt;b&gt;liuhuigx.&lt;/b&gt;&#xD;
 MoSync:跨多平台android,j2me,&#xD;
 Symbian ,wm的开发工具。. [联机] http://www.iteye.com/topic/600808.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;作者：马昊伯&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;出处：&lt;/span&gt;&lt;a href="http://loning.cnblogs.com"&gt;http://loning.cnblogs.com/&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;个人网站&lt;/span&gt;&lt;span&gt;:&amp;nbsp;&lt;a href="http://loning.wiisio.com/"&gt;http://loning.wiisio.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，否则保留追究法律责任的权利。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/2046376.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2011/05/14/2046376.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2011/04/13/2015202.html</id><title type="text">pInvokeStackImbalance MDA 异常解决方法</title><summary type="text">如果 CLR 检测到平台 invoke 调用之后的堆栈深度与&amp;#160;DllImportAttribute&amp;#160;特性指定的调用约定中以及托管签名的参数声明中提供的预期堆栈深度不匹配，则将激活pInvokeStackImbalance&amp;#160;托管调试助手 (MDA)。 具体见http://msdn.microsoft.com/zh-cn/library/0htdy0k3.aspx	如何取消呢？	Figure 1 忽略...</summary><published>2011-04-13T11:09:00Z</published><updated>2011-04-13T11:09:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2011/04/13/2015202.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2011/04/13/2015202.html"/><content type="html">&lt;p&gt;&lt;span style="color:black; font-size:10pt"&gt;&lt;span style="font-family:宋体"&gt;如果&lt;/span&gt;&lt;span style="font-family:Segoe UI"&gt; CLR &lt;/span&gt;&lt;span style="font-family:宋体"&gt;检测到平台&lt;/span&gt;&lt;span style="font-family:Segoe UI"&gt; invoke &lt;/span&gt;&lt;span style="font-family:宋体"&gt;调用之后的堆栈深度与&lt;/span&gt;&lt;span style="font-family:Segoe UI"&gt; &lt;a href="http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.dllimportattribute.aspx"&gt;&lt;span style="color:#1364c4"&gt;DllImportAttribute&lt;/span&gt;&lt;/a&gt; &lt;/span&gt;&lt;span style="font-family:宋体"&gt;特性指定的调用约定中以及托管签名的参数声明中提供的预期堆栈深度不匹配，则将激活&lt;/span&gt;&lt;span style="font-family:Segoe UI"&gt;pInvokeStackImbalance &lt;/span&gt;&lt;span style="font-family:宋体"&gt;托管调试助手&lt;/span&gt;&lt;span style="font-family:Segoe UI"&gt; (MDA)&lt;/span&gt;&lt;span style="font-family:宋体"&gt;。&lt;/span&gt;&lt;span style="font-family:Segoe UI"&gt;&#xD;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black"&gt;&lt;span style="font-family:宋体; font-size:10pt"&gt;具体见&lt;a href="http://msdn.microsoft.com/zh-cn/library/0htdy0k3.aspx"/&gt;&lt;/span&gt;http://msdn.microsoft.com/zh-cn/library/0htdy0k3.aspx&lt;/span&gt;&#xD;
	&lt;/p&gt;&lt;p&gt;如何取消呢？&#xD;
&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104131908445225.png" alt=""/&gt;&#xD;
	&lt;/p&gt;&lt;p style="text-align: justify"&gt;&lt;span style="font-size:10pt"&gt;Figure 1 忽略MDA抛出的异常&#xD;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;取消图中选择的项目就ok了&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/2015202.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2011/04/13/2015202.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2011/04/06/2006862.html</id><title type="text">天津大学免费上网，IPV4及IPV6同时共享的解决方案</title><summary type="text">首先希望大家了解咱们用的无线路由器的2个端口，WAN与LAN。一般买来的路由器WAN口只有一个，LAN口有4个。通过无线网络对路由器的连接是连接到LAN口的。为了便于理解，我把无线路由器标识成Figure 1 无线路由器的样式。	Figure 1 无线路由器我们现在所使用的网络结构一般如Figure 2 一般网络共享视图的样式。	Figure 2 一般网络共享视图现在我们学校的网络是直接支持IPV6，只要安装有IPV6的网络协议就可以Ping同IPV6的主机，但是是不能解析域名的，而使用了IPV4连接之后就可以登录如bt.neu6.edu.cn的网站，这是由于我们在访问IPV6的站点时，系统使</summary><published>2011-04-06T07:34:00Z</published><updated>2011-04-06T07:34:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2011/04/06/2006862.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2011/04/06/2006862.html"/><content type="html">&lt;p&gt;首先希望大家了解咱们用的无线路由器的2个端口，WAN与LAN。一般买来的路由器WAN口只有一个，LAN口有4个。通过无线网络对路由器的连接是连接到LAN口的。为了便于理解，我把无线路由器标识成Figure 1 无线路由器的样式。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531235348.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 1 无线路由器&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们现在所使用的网络结构一般如Figure 2 一般网络共享视图的样式。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531242558.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 2 一般网络共享视图&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在我们学校的网络是直接支持IPV6，只要安装有IPV6的网络协议就可以Ping同IPV6的主机，但是是不能解析域名的，而使用了IPV4连接之后就可以登录如bt.neu6.edu.cn的网站，这是由于我们在访问IPV6的站点时，系统使用的是IPV4的DNS。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;也就是说，我们学校的IPV6网络的DHCP服务默认只分配了IPV6地址，但是DNS是错误的。我在使用的过程中，发现上交的DNS是很稳定的，地址是2001:da8:8000:1:202:120:2:101。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531242591.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 3 DNS设置&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用Figure 3 DNS设置，即可在不配置IPV4（也不需要修改mac地址）的基础上进行IPV6网络访问。所以如果您的寝室使用联通的网络，有一个学校的网口没有使用的话，直接设置就可以上IPV6的站点了，通过IPV6 to IPV4的一些在线服务，则可以实现免费上网。该上网方式如Figure 4 单机免费上网的方式。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531247923.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 4 单机免费上网的方式&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果您需要共享这个网络，只需要买一个交换机，或者使用路由器的LAN口（也就是说把一个LAN口与我校提供的网口相连）。特别需要提醒的是，无线路由器也通过无线方式也可以实现IPV6网络的共享。详细见Figure 5 共享IPV6免费上网的方式。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/20110406153124115.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 5 共享IPV6免费上网的方式&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在咱们开始最给力的事，IPV4及IPV6同时共享上网（毕竟IPV6太慢了，学校20块钱10G还是挺划算的）。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531245132.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 6 IPV4及IPV6同时共享上网&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图中的交换机可以使用一个路由器代替，只用该路由器的LAN口就可以了，注意要把该路由器的DHCP服务关闭。这样就可以实现同时共享上网了。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;我们实验室由于已经存在一个路由，而且不好改，因此我们的网络方案如Figure 7 我们实验室现在的网络结构。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531248512.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 7 我们实验室现在的网络结构&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201104/201104061531256037.png" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 8 win7自动生成的网络映射&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #333333;"&gt;&lt;span style="font-family: 宋体;"&gt;作者：马昊伯&lt;/span&gt;&lt;span style="font-family: Georgia;"&gt;&#xD;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #333333;"&gt;&lt;span style="font-family: 宋体;"&gt;出处：&lt;a href="http://loning.cnblogs.com/"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: Georgia;"&gt;http://loning.cnblogs.com/&lt;span style="color: #3d81ee; text-decoration: underline;"&gt;&#xD;
				&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #333333;"&gt;&lt;span style="font-family: 宋体;"&gt;个人网站&lt;/span&gt;&lt;span style="font-family: Georgia;"&gt;: &lt;a href="http://loning.wiisio.com/"&gt;http://loning.wiisio.com/&lt;/a&gt;&#xD;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #333333;"&gt;&lt;span style="font-family: 宋体;"&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，否则保留追究法律责任的权利。&lt;/span&gt;&lt;span style="font-family: Georgia;"&gt;&#xD;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/2006862.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2011/04/06/2006862.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/12/12/1903807.html</id><title type="text">纪念那个死去的ASP.NET CMS系统，附死了的源码</title><summary type="text">该项目是在高中保送之后的那段时间开发的，那时朋友希望放弃ASP的CMS开发，转而做其他平台，由于我对.NET比较喜爱，便强力推荐他做.NET的。不过由于当时我比较追求所谓的架构，朋友也不怎么理解，最后就自己一个人做了。当时也是一边学习一边做，很多东西理解的层次自然十分浅薄，比如三层，当时根本不懂，以为一个项目就是一层，接口单独出来一个项目以为又多出一层，呵呵。做也是比着葫芦画瓢，抄PETSHOP。但是真的做完这个项目，我对.NET才算是真正了解了。记得当时也是在园子吧，看天轰穿老师的视频，学到好多控件的用法。由于当时就认识到.NET WEBFORM效率极其低下（每次数据回发量太大了）、页面元素</summary><published>2010-12-12T09:08:00Z</published><updated>2010-12-12T09:08:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/12/12/1903807.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/12/12/1903807.html"/><content type="html">&lt;p&gt;该项目是在高中保送之后的那段时间开发的，那时朋友希望放弃ASP的CMS开发，转而做其他平台，由于我对.NET比较喜爱，便强力推荐他做.NET的。不过由于当时我比较追求所谓的架构，朋友也不怎么理解，最后就自己一个人做了。当时也是一边学习一边做，很多东西理解的层次自然十分浅薄，比如三层，当时根本不懂，以为一个项目就是一层，接口单独出来一个项目以为又多出一层，呵呵。做也是比着葫芦画瓢，抄PETSHOP。但是真的做完这个项目，我对.NET才算是真正了解了。记得当时也是在园子吧，看天轰穿老师的视频，学到好多控件的用法。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;由于当时就认识到.NET WEBFORM效率极其低下（每次数据回发量太大了）、页面元素难以控制，因此在网站前台决定不使用ASP.NET的任何控件，完全基于类似ASP、PHP的输出方式。当时不了解MVC，ASP.NET官方的MVC也没出来。而在web的后台，为了开发的便捷性，使用了WEBFORM，当然后果是十分严重的，最近用chrome打开后台发现菜单错位了，好在IE中还是正常的。但是如果没有WEBFORM，相信我一个人难以做出那么多东西来。便捷的东西就是这样，很难以去控制其中的方方面面，即便是有一些方法能够实现，在真正实现之后发现比自己写一套还要麻烦。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201012/201012121703034996.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 1 错位了&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;该项目是比着PETSHOP做的，因此分了三层，在数据层使用了一个支持ACCESS与MS SQL的组建（其实并不是完全兼容的，只是在这个项目中没用到譬如触发器之类的东西罢了，当时居然还会考虑ACCESS&amp;hellip;）。因此对两种数据库有一些兼容性，比较讽刺的是兼容却放在Data Layer来做了，其实自始至终也没实现过其他的Data Layer，然后这个项目就死掉了。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;先说说后台的开发吧。微软还是很强大的，能在WEB上做出事件驱动来。感觉很强大的就是数据绑定功能，在三层的基础上，我只要为每一个Data Source指定一个Business Object，.NET就可以通过反射自动的提供相当多的信息到Grid View，Detail View里面，然后需要修改的地方就是改改每个Column的Name。对于需要特定显示的地方，还可以更改相关控件的模板，在模板中可以用各种各样的控件，而且也是支持绑定的，所以在这一层的工作相当清晰，就是控制数据的表现形式。而且通过Data Source，可以很轻松的实现几个控件的联动。Data Source可以很方便的绑定Business Object提供的方法的相关参数，可以绑定到Request，绑定到某个控件的属性。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201012/201012121703376413.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 2 后台界面截图&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在后台的开发过程中，对自定义服务器控件，自定义用户控件等都有了一定的了解。控件化的好处就是拿来就用，FCKeditor（现在应该叫CKedirot了）的那个控件很轻松的就融入了系统。还了解到了ASP.NET的权限控制，对目录的权限也可以有，在系统中也加入了相关的配置页面。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;在前台，受朋友开发的ASP系统的影响，引入了使用标签的模板系统。自己写了一套asp.net的小型模板，标签形式都是自定义的，而且是可扩展的，也用了反射。但是现在看来，用反射而又没有做一些处理，效率应当是十分低下的。其基本工作原理就是正则表达式匹配标签，而后通过标签的进行多态，把相关的内容返回然后REPLACE。后期发现确实挺慢的，还引入了缓存，其实就是很傻的放到ASP.NET的内存中，缓存策略也很傻，更改时删掉那个缓存项。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201012/20101212170348175.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 3 前台某模板界面&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前台直接实现了一个Http Module，这个Module是可配置的，也是通过反射来加载一些模块。现在看来Http Module有点像Router，加载的模块有点像Controller了。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201012/20101212170349948.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 4 配置节点的一些信息&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;前台的交互则是使用的jQuery + Web Service，由于Web Service支持Json的序列化，所以相关数据交互还是很轻松的。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/201012/201012121703504503.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 5 基于Web Service与 JS 的登录系统&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这么多层，代码自然不是全部是自己写的，用了代码生成器来做跟数据库有关的事情。自己下了个模板改了改，就是这样。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;对.NET的配置有了一些了解，譬如如何自定义配置节点。强类型的配置信息还是比较好用的，最近在WINFORM下做配置信息都没那么麻烦的做过了，直接用Settings。也没有比较过二者有何不同，或者就是一样的？&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;用户系统则使用了ASP.NET的Membership，挺强大的，而且不用那些登录控件也完全可以实现登录。自己实现了一个Membership Provider，毕竟要使用三层中的Data Layer。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;已经很长时间没动过这个代码了，今天翻硬盘的时候偶然发现的，但是又不忍心删掉，写此文以纪念。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;代码在此提供下载：&lt;a href="http://wiisio.qiqikaka.com/kingcms.7z"&gt;http://wiisio.qiqikaka.com/kingcms.7z&lt;/a&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p&gt;用户admin 密码 123456&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;作者：马昊伯 a.loning at gmail.com&lt;/p&gt;&#xD;
&lt;p&gt;出处：&lt;a href="http://loning.cnblogs.com/"&gt;http://loning.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="MySignature"&gt;&lt;span&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，否则保留追究法律责任的权利。&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1903807.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/12/12/1903807.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/12/09/1900465.html</id><title type="text">基于事件通信的轻量级MVP框架实现，附源码</title><summary type="text">在.NET中，对于ASP.NET，有MVC；对于WPF、SILVERLIGHT，有MVVM。然而在桌面开发领域，似乎微软并没有推出什么强力的框架。但笔者在写程序的时候很不喜欢把代码全部混杂在一个类中。这个问题很容易解决，一种是使用现成的对平台没有依赖性的MVC框架，比如PureMVC，当然学习一个框架需要一些时间，另一种方法就是自己做一个小框架，恐怕称之为框架都有些太夸大了。</summary><published>2010-12-09T04:16:00Z</published><updated>2010-12-09T04:16:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/12/09/1900465.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/12/09/1900465.html"/><content type="html">&lt;p&gt;在.NET中，对于ASP.NET，有MVC；对于WPF、SILVERLIGHT，有MVVM。然而在桌面开发领域，似乎微软并没有推出什么强力的框架。但笔者在写程序的时候很不喜欢把代码全部混杂在一个类中。这个问题很容易解决，一种是使用现成的对平台没有依赖性的MVC框架，比如PureMVC，当然学习一个框架需要一些时间，另一种方法就是自己做一个小框架，恐怕称之为框架都有些太夸大了。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;首先需要确定的是这个小框架要实现的功能。MVC虽然经典，但是View层的数据获取需要从Model直接获取，而View的操作行为则是需要通过Controller来更新Model。也就是说在View与Model通信过程中，Controller负责那些变更状态的事情。然而MVC中比较严重的问题是View需要引用Model，这就导致了View层对Model的依赖。主动MVC与被动MVC都存在这样的问题。（见Figure 1 主动MVC、Figure  2 被动MVC）而MVP则不存在这样的问题，但是在MVP中Presenter承担了更多的事情。在Presenter中，大致有两种信息，一种是改变Model状态的控制信息，一种是改变View显示的状态信息。对于特定的策略，如Presenter是主动的询问Model发现变更后通知View，还是Model通过Observer模式通知Presenter，Presenter再去通知View改变内容这类的事情，则可以具体到每个特定的Presenter中来实现。(见Figure 3 MVP模式)&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP1.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 1 主动MVC&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP2.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure  2 被动MVC&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP3.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 3 MVP模式&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MVP具体到.NET中来，在其中使用的Observer模式自然可以用事件实现。笔者认为虽然一个Presenter有可能会存在需要多个视图以及多个Model的情况，但是大多情况下，一个Presenter仅仅关注一个Model。对于View，情况则比较复杂，通常为了将某一类Model的信息显示出来，我们会为其专门定制一个View，但是，我们还需要输出许多信息，看上去我们是需要向其他的View发送信息。但是，如果我们为每一个View都做一个Presenter，一个Model的话，我们只需要在当前Presenter引用那个View所对应的Model，发送相应信息就好了。所以，笔者的原则就是，不要让更新不属于当前Presenter的View，而是通过该Presenter引用Model实现其他信息的输出。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP4.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 4 框架接口&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div  style="text-align: left;"&gt;&#xD;
&lt;pre &gt;public interface IView&#xD;
    {&#xD;
        void Initialize();&#xD;
    }&#xD;
	public interface IModel&#xD;
    {&#xD;
        void Initialize();&#xD;
        event EventHandler Initialized;&#xD;
    }&#xD;
	public interface IPresenter&#xD;
    {&#xD;
        void SetView(IView view);&#xD;
        void SetModel(IModel model);&#xD;
        void SetUnityContainer(IUnityContainer unityContainer);&#xD;
        void Initialize();&#xD;
        string Name { get; }&#xD;
        Guid ID { get; }&#xD;
        IView GetView();&#xD;
        IModel GetModel();&#xD;
    }&#xD;
    public interface IPresenter&amp;lt;V, M&amp;gt; : IPresenter&#xD;
        where V : IView&#xD;
        where M : IModel&#xD;
    {&#xD;
        void SetView(V view);&#xD;
        void SetModel(M model);&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;以上是笔者设计的接口。Model与View的初始化有时需要一定的时间，我们可以把这些方法封装起来，便于今后控制。然后在Presenter中提供了一些基本方法，如更改获取View及Model，以及一个初始化方法，该初始化方法的默认实现是会初始化View后初始化Model。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;在设计过程中，笔者认为有大量的Presenter方法是需要重用的，因此就写了一个抽象的基类实现一些方法，在开发过程中，又引入了IUnityContainer，因此实现了两个版本。BasePresenter不会自动注入View与Model，而Presenter会自动注入。&#xD;
&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP5.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 5 Presenter基类&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在实现BasePresenter的过程中，使用了模板方法将几个最常用的方法定义出来，如在添加Model的时候绑定Model的事件，移除Model的时候移除绑定Model的事件。还有就是在Model初始化完成的时候，也经常需要Presenter去做一些事情，也定义了出来。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;为了便于标识与更友好的显示名称，也加入了相关的属性来标识。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public abstract class BasePresenter&amp;lt;V, M&amp;gt; : IPresenter&amp;lt;V, M&amp;gt;&#xD;
        where V : IView&#xD;
        where M : IModel&#xD;
    {&#xD;
&#xD;
        public BasePresenter()&#xD;
        {&#xD;
            var type = this.GetType();&#xD;
            var assembly = type.Assembly;&#xD;
            try&#xD;
            {&#xD;
                ResourceManager rm = new ResourceManager(assembly.GetName().Name + ".TextResource", assembly);&#xD;
&#xD;
                Name = rm.GetString(type.Name);&#xD;
            }&#xD;
            catch&#xD;
            {&#xD;
            }&#xD;
            finally&#xD;
            {&#xD;
                if (Name == null)&#xD;
                    Name = type.Name;&#xD;
            }&#xD;
            ID = Guid.NewGuid();&#xD;
        }&#xD;
        public IView GetView()&#xD;
        {&#xD;
            return this.View;&#xD;
        }&#xD;
        public IModel GetModel()&#xD;
        {&#xD;
            return this.Model;&#xD;
        }&#xD;
        public V View { get; private set; }&#xD;
        public M Model { get; private set; }&#xD;
        public string Name { get; protected set; }&#xD;
        public Guid ID { get; protected set; }&#xD;
        protected IUnityContainer UnityContainer { get; private set; }&#xD;
        public delegate void ThreadInvoker();&#xD;
        &#xD;
        protected virtual void Invoke(ThreadInvoker invoker)&#xD;
        {&#xD;
            invoker.BeginInvoke(null, null);&#xD;
        }&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// Remove the model events bound to the Presenter&#xD;
        /// Note:The Initialized event.&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        protected abstract void BindModelEvents();&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// Remove the model events bound to the Presenter&#xD;
        /// Note:The Initialized event.&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        protected abstract void RemoveModelEvents();&#xD;
&#xD;
&#xD;
        #region IPresenter&amp;lt;V,M&amp;gt; 成员&#xD;
&#xD;
        public virtual void SetView(V view)&#xD;
        {&#xD;
            this.View = view;&#xD;
        }&#xD;
&#xD;
        public virtual void SetModel(M model)&#xD;
        {&#xD;
            if (this.Model != null)&#xD;
            {&#xD;
                Model.Initialized -= new EventHandler(ModelInitialized);&#xD;
                RemoveModelEvents();&#xD;
            }&#xD;
            this.Model = model;&#xD;
            Model.Initialized += new EventHandler(ModelInitialized);&#xD;
            BindModelEvents();&#xD;
        }&#xD;
&#xD;
        public void SetView(IView view)&#xD;
        {&#xD;
            SetView((V)view);&#xD;
        }&#xD;
&#xD;
        public void SetModel(IModel model)&#xD;
        {&#xD;
            SetModel((M)model);&#xD;
        }&#xD;
&#xD;
        public virtual void Initialize()&#xD;
        {&#xD;
            View.Initialize();&#xD;
            Model.Initialize();&#xD;
        }&#xD;
&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// &#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        protected abstract void ModelInitialized(object sender, EventArgs e);&#xD;
&#xD;
        [InjectionMethod]&#xD;
        public void SetUnityContainer(IUnityContainer unityContainer)&#xD;
        {&#xD;
            this.UnityContainer = unityContainer;&#xD;
        }&#xD;
&#xD;
        #endregion&#xD;
}&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过一些这样的定义，我们就已经实现了一个简易的MVP框架。下面来说说这个框架怎么用。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;这个框架比较好的一点就是比较适合懒人用，因为消息通知都是基于.net的方法或者事件来实现的，所以IDE都能直接认。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;我们现在要实现一个累加器，Model的实现很容易。有一个方法来进行累加，有一个属性来提供当前数字，还有一个事件来通知累加的数已经改变了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public interface IHelloMvpModel : IModel&#xD;
    {&#xD;
        void Plus();&#xD;
        int GetNumber { get; }&#xD;
        event EventHandler NumberChanged;&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public class HelloMvpModel : IHelloMvpModel&#xD;
    {&#xD;
        private int _Number;&#xD;
        public void Plus()&#xD;
        {&#xD;
            ++_Number;&#xD;
            if (NumberChanged != null)&#xD;
                NumberChanged(this, EventArgs.Empty);&#xD;
        }&#xD;
&#xD;
        public int GetNumber&#xD;
        {&#xD;
            get { return _Number; }&#xD;
        }&#xD;
&#xD;
        public void Initialize()&#xD;
        {&#xD;
            if (Initialized != null)&#xD;
                Initialized(this, EventArgs.Empty);&#xD;
        }&#xD;
&#xD;
        public event EventHandler Initialized;&#xD;
&#xD;
&#xD;
        public event EventHandler NumberChanged;&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;而View层就更简单了，接收用户操作与显示数据。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public interface IHelloMvpView : IView&#xD;
    {&#xD;
        void SetNumber(int number);&#xD;
        event EventHandler ChangeNumberRequested;&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public partial class HelloMvpView : Form,IHelloMvpView&#xD;
    {&#xD;
        public HelloMvpView()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
        }&#xD;
&#xD;
        public void SetNumber(int number)&#xD;
        {&#xD;
            Invoke((MethodInvoker)delegate()&#xD;
            {&#xD;
                this.Text = number.ToString();&#xD;
            });&#xD;
            //throw new NotImplementedException();&#xD;
        }&#xD;
&#xD;
        public void Initialize()&#xD;
        {&#xD;
            &#xD;
            //throw new NotImplementedException();&#xD;
        }&#xD;
&#xD;
&#xD;
        public event EventHandler ChangeNumberRequested;&#xD;
&#xD;
        private void button1_Click(object sender, EventArgs e)&#xD;
        {&#xD;
            if (ChangeNumberRequested != null)&#xD;
                ChangeNumberRequested(this, EventArgs.Empty);&#xD;
        }&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在主程序，我们这样来进行调用。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;static void Main()&#xD;
        {&#xD;
            Application.EnableVisualStyles();&#xD;
            Application.SetCompatibleTextRenderingDefault(false);&#xD;
&#xD;
            IUnityContainer container = new UnityContainer();&#xD;
            container.RegisterInstance(container);&#xD;
            container.RegisterType&amp;lt;IHelloMvpModel, HelloMvpModel&amp;gt;();&#xD;
            container.RegisterType&amp;lt;IHelloMvpView, HelloMvpView&amp;gt;();&#xD;
&#xD;
            var p = container.Resolve&amp;lt;HelloMvpPresenter&amp;gt;();&#xD;
            p.Initialize();&#xD;
            Application.Run((Form) p.View);&#xD;
        }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP6.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 6 运行截图&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP7.png" alt="" /&gt;&#xD;
	&lt;/p&gt;&#xD;
&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 10pt;"&gt;Figure 7 点击按钮后&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然实现起来比较繁杂，但是对比较大的程序来说，有这样一套框架可以很好的帮助开发者，使得混杂在一起的数据更加的清晰。笔者现在已经通过这样的框架实现了一些实用的程序。&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP8.png" alt="" /&gt;&lt;span style="color: black; font-family: Times New Roman; font-size: 0pt; background-color: black;"&gt;&#xD;
			&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP9.png" alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/loning/120810_0935_MVP10.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这篇文章大概就完了，可能有时间会再写一篇用该框架实现一些通用ToolWindow的实现，在程序源码中的Loning.MvpWinform项目中。写这个小框架大概一年前写的，现在想来IPresenter似乎没什么意义，大概也就是在初始化的时候多态一下，对View与Model的单一限制似乎也不好，在开发过程中有时也会感到很麻烦。但是比较可以肯定的是开发的时候，思维会比较清晰。如果大家有时间看这篇文章，欢迎指出不足之处。&lt;/p&gt;&#xD;
&lt;p&gt;程序源码:&amp;nbsp;&lt;a href="http://www.wiisio.com/LoningLibrary.7z"&gt;http://www.wiisio.com/LoningLibrary.7z&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考文章：MVP模式与MVC模式&amp;nbsp;&lt;a href="http://www.uml.org.cn/sjms/201006244.asp"&gt;http://www.uml.org.cn/sjms/201006244.asp&lt;/a&gt;&amp;nbsp;部分图摘自本篇文章&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;作者：马昊伯&lt;/p&gt;&#xD;
&lt;p&gt;出处：&lt;a href="http://loning.cnblogs.com/"&gt;http://loning.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="MySignature"&gt;&lt;span&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，否则保留追究法律责任的权利。&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1900465.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/12/09/1900465.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/12/08/1900725.html</id><title type="text">Git初始化的相关问题</title><summary type="text">这是由于git默认拒绝了push操作，需要进行设置，修改.git/config文件后面添加如下代码：[receive]denyCurrentBranch = ignore无法查看push后的git中文件的原因与解决方法在初始化远程仓库时最好使用 git --bare init 而不要使用：git init如果使用了git init初始化，则远程仓库的目录下，也包含work tree，当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上（如果当时不在push的分支，就没有问题）, 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容。</summary><published>2010-12-08T14:23:00Z</published><updated>2010-12-08T14:23:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/12/08/1900725.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/12/08/1900725.html"/><content type="html">&lt;p&gt;这是由于git默认拒绝了push操作，需要进行设置，修改.git/config文件后面添加如下代码：&lt;/p&gt;&#xD;
&lt;p&gt;[receive]&lt;/p&gt;&#xD;
&lt;p&gt;denyCurrentBranch = ignore&lt;/p&gt;&#xD;
&lt;p&gt;无法查看push后的git中文件的原因与解决方法&lt;/p&gt;&#xD;
&lt;p&gt;在初始化远程仓库时最好使用 git --bare init 而不要使用：git init&lt;/p&gt;&#xD;
&lt;p&gt;如果使用了git init初始化，则远程仓库的目录下，也包含work tree，当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上（如果当时不在push的分支，就没有问题）, 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容。&lt;/p&gt;&#xD;
&lt;p&gt;解决方法：&lt;/p&gt;&#xD;
&lt;p&gt;必须得使用命令 git reset --hard 才能看到push后的内容.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1900725.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/12/08/1900725.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/12/06/1897660.html</id><title type="text">解决mysql表已满的错误</title><summary type="text">最近自己的vps总是出现网站不能访问，一片空白的问题，在检查日志文件后发现php及nginx都没有出问题，于是分析了一下mysql的日志，的确是出错了，101206 12:49:03 [ERROR] /usr/local/mysql/libexec/mysqld: The table &amp;#39;cache&amp;#39; is full101206 12:49:06 [ERROR] /usr/local/mysql/libexec/mysqld: The table &amp;#39;cache&amp;#39; is full101206 12:49:21 [ERROR] /usr/local/mysql/lib</summary><published>2010-12-06T05:13:00Z</published><updated>2010-12-06T05:13:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/12/06/1897660.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/12/06/1897660.html"/><content type="html">&lt;p&gt;最近自己的vps总是出现网站不能访问，一片空白的问题，在检查日志文件后发现php及nginx都没有出问题，于是分析了一下mysql的日志，的确是出错了，&lt;/p&gt;&#xD;
&lt;p&gt;101206 12:49:03 [ERROR] /usr/local/mysql/libexec/mysqld: The table 'cache' is full101206 12:49:06 [ERROR] /usr/local/mysql/libexec/mysqld: The table 'cache' is full101206 12:49:21 [ERROR] /usr/local/mysql/libexec/mysqld: The table 'cache' is full&lt;/p&gt;&#xD;
&lt;p&gt;一堆表满错误，于是google了下，以下是解决方法。&lt;/p&gt;&#xD;
&lt;p&gt;配置文件在 /etc/my.cnf&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;After using MySQL memory engine table as middle cache table, we got this error when application inserting the data to the table. Seems there is some limits on the table. After searching on Google, we know that we need to change some default settings.&lt;/p&gt;&#xD;
&lt;p&gt;The global system variable "&lt;strong&gt;max_heap_table_size&lt;/strong&gt;" define the maximum size memeory table can reach. The default values is 16384 (Maybe it's OS dependant). So you can change it with the following steps.&lt;/p&gt;&#xD;
&lt;p&gt;Run the following command to change it at system level.&lt;/p&gt;&#xD;
&lt;blockquote &gt;set global max_heap_table_size=1048576000&lt;/blockquote&gt;&#xD;
&lt;p&gt;Then modify the MySQL configuration file, adding a new line at the end. So when next time database get restarted, the change can be permanent.&lt;/p&gt;&#xD;
&lt;blockquote &gt;max_heap_table_size=1048576000&lt;/blockquote&gt;&#xD;
&lt;p&gt;Finally, you need to reconnect to MySQL, and rebuild all the tables.&lt;/p&gt;&#xD;
&lt;blockquote &gt;ALTER TABLE ... ENGINE MEMORY;&lt;/blockquote&gt;&#xD;
&lt;p&gt;The last step is to let application reconnect to MySQL database, to take the change effective.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1897660.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/12/06/1897660.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/11/28/1890121.html</id><title type="text">Publish 提示与目标版本不同</title><summary type="text">注意发布的时候是不是换平台了，x86跟any cpu是不一样的。。</summary><published>2010-11-28T03:13:00Z</published><updated>2010-11-28T03:13:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/11/28/1890121.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/11/28/1890121.html"/><content type="html">&lt;p&gt;注意发布的时候是不是换平台了，x86跟any cpu是不一样的。。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1890121.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/11/28/1890121.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/11/27/1890017.html</id><title type="text">C++关闭在debug模式下的“Microsoft Visual C++ Debug Library”对话框</title><summary type="text">引用#include&amp;lt;Crtdbg.h&amp;gt;在main函数中_CrtSetReportMode(_CRT_ASSERT,0);</summary><published>2010-11-27T15:41:00Z</published><updated>2010-11-27T15:41:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/11/27/1890017.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/11/27/1890017.html"/><content type="html">&lt;pre&gt;&lt;span&gt;&lt;pre&gt;&lt;span&gt;引用&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;span&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span&gt;&amp;lt;Crtdbg.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
在main函数中&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;span&gt;_CrtSetReportMode&lt;/span&gt;(&lt;span&gt;_CRT_ASSERT&lt;/span&gt;,&amp;nbsp;0);&lt;br /&gt;&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1890017.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/11/27/1890017.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/loning/archive/2010/11/24/1887125.html</id><title type="text">Qt 中Enum进行反射来做Enum to QString</title><summary type="text">i assume you wanttoretrieve a QMetaEnumfor a particularenumwhich is registered withQ_ENUMS.let {class} denote the QObject-derived class which contains theenum, and let {enumName} denote the name of theenum. the following code gets you theenum&amp;#39;s QMetaEnum:QMetaObject metaObject = {class}.staticMe</summary><published>2010-11-24T14:37:00Z</published><updated>2010-11-24T14:37:00Z</updated><author><name>Loning</name><uri>http://www.cnblogs.com/loning/</uri></author><link rel="alternate" href="http://www.cnblogs.com/loning/archive/2010/11/24/1887125.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/loning/archive/2010/11/24/1887125.html"/><content type="html">&lt;p&gt;i assume you want&amp;nbsp;&lt;span &gt;to&lt;/span&gt;&amp;nbsp;retrieve a QMeta&lt;span &gt;Enum&lt;/span&gt;&amp;nbsp;for a particular&amp;nbsp;&lt;span &gt;enum&lt;/span&gt;&amp;nbsp;which is registered with&amp;nbsp;&lt;span&gt;Q_&lt;span &gt;ENUM&lt;/span&gt;S&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;let {class} denote the QObject-derived class which contains the&amp;nbsp;&lt;span &gt;enum&lt;/span&gt;, and let {&lt;span &gt;enum&lt;/span&gt;Name} denote the name of the&amp;nbsp;&lt;span &gt;enum&lt;/span&gt;. the following code gets you the&amp;nbsp;&lt;span &gt;enum&lt;/span&gt;'s QMeta&lt;span &gt;Enum&lt;/span&gt;:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;QMetaObject metaObject = {class}.staticMetaObject;&#xD;
QMetaEnum metaEnum = metaObject.enumerator( metaObject.indexOfEnumerator( {enumName} ) );&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;this compiles despite the fact that neither QMetaObject nor QMeta&lt;span &gt;Enum&lt;/span&gt;&amp;nbsp;define&amp;nbsp;&lt;span&gt;opera&lt;span &gt;to&lt;/span&gt;r=()&lt;/span&gt;. i'm not sure why--they must be defined somewhere else, but i can't find them.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/loning/aggbug/1887125.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/loning/archive/2010/11/24/1887125.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
