在线
客服

在线客服
尊敬的客户,我们24小时竭诚为您服务 公司总机: 0755-83312037 (32条线)

客服
热线

0755-83312037 (32条线)
7*24小时客服服务热线

?

关注
微信

关注官方微信
TOP

返回
顶部

  • 17

    2018-05
    Visual Studio 2010- IntelliTrace(智能跟踪)

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">谈谈Visual Studio 2010- IntelliTrace(智能跟踪)</font> </td> </tr></tbody></table> <p align="center"><strong>谈谈Visual Studio 2010- IntelliTrace(智能跟踪)</strong></p> <p align="left"><strong>Visual Studio 2010 Ultimate</strong> 版本有个新功能<strong>IntelliTrace</strong>(<strong>智能跟踪</strong>),<strong>IntelliTrace</strong>被引入到Visula Studio中来加速我们对.NET应用程序的调试,它通过对预先设置的事件和方法在运行过程中的跟踪并将其有效地传递给调试执行者,从而快速的传递程序在执行过程中的状态和各种信息来帮助开发者更好的调试程序,快速的发现问题。实际上,在Visual Studio 2010之前,Microsoft Visual Stuido已经帮助我们很好的继承了调试工具,比如对变量的监控,对堆栈的查看等等,并且允许设置断点进行单步调试等。所有的这些都在很好的帮助开发者来了解程序在不同的执行过程中的状态以及检测是否按照预先实际的逻辑进行运转,而且更多的,我们通过断点后监测程序状态来发现问题所在。而这样所存在的问题是,一些逻辑上的错误可能发生在断点执行之前,而且很可能是一些无法追查。开发者必须停止当前的调试,重新设置断点并启动调试,而这样的试验过程往往需要很多次才能找到正确的位置来设置断点。IntelliTrace智能的将一些调试信息和程序状态自动的跟踪并实施的展现给开发人员,从而减少了需要程序员找到适当的断点才能跟踪和监控程序运行状态的过程。</p> <p align="left">Visual Studio提供给我们两个方式来控制其搜集信息的内容源,一个是IntelliTrace events only,仅仅收集智能跟踪事件和调试中断的相关数据;另外一个是IntelliTrace events and call information,这个就会收集除了IntelliTrace事件之外对一个方法调用的进入和退出的各种数据。下边我们来看看在Visual Studio 2010中如何设置IntelliTrace的跟踪选项。</p> <p align="left">进入到工具 --&gt; 选项 --&gt; IntelliTrace。它在默认状态下是启用的,但是,仅捕捉事件,因为捕捉事件是便宜的。然而,当你开始跟踪所有这些调用信息时,真正的价值开始显现出来了。你每一次调试的时候,IntelliTrace都将弹出来,你在动态调试的时候可以使用这个历史性的调试工具。假如我在那里并且有一个断点,但是,我要备份和重新设计这个断点,我可以使用IntelliTrace完成这个任务。</p> <p align="left">使用IntelliTrace捕捉到调试进程的其他人可以把记录以及.dlls和pdbs文件发送给你,你可以重放它们的进程。这个进程也许进入到数据库(你没有这个数据库),它也许是采用你不能复制的方法设置的,它可能在你不能企及的网络上,但是,你不用担心,因为你拥有记录以及.dlls和pdbs文件,你可以重放。</p> <p align="left">当然,拥有源代码会更好,因为那样你就能够看到这个代码好像是在你自己的机器上调试它一样。这对于在你的机器上运行正常,在其他人的机器不能运行的那些神秘的故障来说是非常好的。它对于多线程的情况也是非常好的,当你经过这个应用程序的时候,这个软件瑕疵就消失了,但是,在正常速度运行时,这个软件瑕疵又出现了。</p> <p align="center"><img border="0" src="http://www.webjx.com/files/allimg/100521/0503380.jpg" width="510" height="299" alt=""></p> <p align="left">默认情况下,IntelliTrace仅仅收集IntelliTrace相关的事件,这样是为了保持所收集的数据较少,并且对于性能上的影响是最小的。而当你选择对方法调用的数据也进行搜集时,除了其临时搜集的数据所占用空间的增大外,对于性能的影响也是较大的。尽管收集到的细节有所不同,但两种方式都会收集一些共同的数据。比如,它总会在第一次启动收集过程时收集系统信息,模块的加载和卸载事件,线程的起始和结束时间等。随着模块和线程的事件,可以正确的更新模块和线程调试窗口的信息。另外,任何模式下,在调试断点处也会对数据进行收集,并将所收集到的基本数据类型和对象在调试其中进行检查和审阅,并允许改变其值。</p> <p align="left">总的说来IntelliTrace调试程序就是为程序开发者量身定制的,通过其独特的“历史调试”功能,为开发者提供了一个反悔追溯过程控制功能。比如,在开发中程序在10分钟前出现一个异常,怎么办呢,如果在以前一般是通过手动调用Debug.Write语句,现在不必了!因为不少开发工具中的这种历史调试功能都非常相似,在VS2010 正式版 中通过IntelliTrace,不但能使程序员看到程序的当前状况,也可以检查某些情况下产生的事件,甚至还能隔离应用程序历史记录中的故障点。所以,启用历史调试之后,VS2010 正式版能够捕获调用堆栈以及相关变量,咱们就可以“回退”至程序的保存前10分钟或者更长时间,检查程序发生异常、故障时的各种情况。因为,在默认情况下程序只保存关键的类型,而开发人员可以选择记录所有的参数,对象以及全局变量。所以,IntelliTrace会主动展示程序运行过程中的关键事件,诸如代码异常、文件访问、时时调试等等。</p>

    Read more +
  • 17

    2018-05
    Visual Studio 2010的Web项目jQuery库

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">VS2010 Web项目的jQuery版本升级.</font> </td> </tr></tbody></table> <p>我们知道在<strong><span>Visual</span> <span>Studio</span> <span>2010</span></strong>的非空Web项目(含Webform和MVC)中,都自动包含了jQuery库在项目的Scripts文件夹中。</p> <p align="center"><a href="http://www.blueidea.com/articleimg/2010/05/7602/01_b.jpg" target="_blank"></a><a href="http://www.qihangnet.com/ct.ashx?id=cd24a2a1-485d-4cf1-95ba-b07b058fc5e1&amp;url=http%3a%2f%2fwww.qihangnet.com%2fcontent%2fbinary%2fWindowsLiveWriter%2fVisualStudio2010WebjQuery_B9F5%2fimage_4.png"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0505580.jpg" width="510" height="255"></a><a href="http://www.qihangnet.com/ct.ashx?id=cd24a2a1-485d-4cf1-95ba-b07b058fc5e1&amp;url=http%3a%2f%2fwww.qihangnet.com%2fcontent%2fbinary%2fWindowsLiveWriter%2fVisualStudio2010WebjQuery_B9F5%2fimage_4.png">&#160;<br>点击放大</a></p> <p>但细心的人们都看到了正式版中包含的<strong>jQuery</strong>版本是1.4.1版,而不是<a href="http://www.qihangnet.com/ct.ashx?id=cd24a2a1-485d-4cf1-95ba-b07b058fc5e1&amp;url=http%3a%2f%2fjquery.com" target="_blank">jQuery官方</a>最新发布的1.4.2版。处于新版效率的极大提升以及部分bug的修复,推荐大家跟新使用1.4.2版,而放弃1.4.1版。单个项目的调整比较简单就是把旧版本的删除,然后添加上1.4.2版的相应文件即可。但我们很多人可能更希望是以后创建的项目都是1.4.2版而不是1.4.1版,怎么办呢?我在相关的webcast中有提到过,即到vs<span>2010</span>的安装目录中修改项目模板的有关文件。目录位置以C#的项目为例如下:</p> <ul> <li>x86: Program Files\Microsoft <span>Visual</span> <span>Studio</span> 10.0\Common7\IDE\ProjectTemplates\CSharp\Web\1033 </li> <li>x64: Program Files (x86)\Microsoft <span>Visual</span> <span>Studio</span> 10.0\Common7\IDE\ProjectTemplates\CSharp\Web\1033</li> </ul> <p>需要修改的文件为,下图中被标黄的:</p> <p align="center"><a href="http://www.blueidea.com/articleimg/2010/05/7602/02_b.jpg" target="_blank"></a><a href="http://www.qihangnet.com/ct.ashx?id=cd24a2a1-485d-4cf1-95ba-b07b058fc5e1&amp;url=http%3a%2f%2fwww.qihangnet.com%2fcontent%2fbinary%2fWindowsLiveWriter%2fVisualStudio2010WebjQuery_B9F5%2fimage_10.png"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0505581.jpg" width="510" height="184"></a><a href="http://www.qihangnet.com/ct.ashx?id=cd24a2a1-485d-4cf1-95ba-b07b058fc5e1&amp;url=http%3a%2f%2fwww.qihangnet.com%2fcontent%2fbinary%2fWindowsLiveWriter%2fVisualStudio2010WebjQuery_B9F5%2fimage_10.png">&#160;<br>点击放大</a></p> <p>&#160;</p> <p>将这三个文件复制出来,然后解压,做如下事情:</p> <ol> <li>先把Scripts文件夹中的jQuery相关文件删除并更新为最新版的,包含jquery-1.4.2-vsdoc.js,jquery-1.4.2.js,jquery-1.4.2.min.js等 </li> <li>然后修改×××××.csproj文件中关于jquery1.4.1的引用改为1.4.2的引用 </li> <li>最后把××××××.vstemplate文件中的jquery-1.4.1替换为jquery-1.4.1 </li> <li>保存上述修改,并打包为zip文件 </li> <li>将新的同名zip文件覆盖回项目模板所在目录 </li> <li>再将打包前的文件覆盖到项目模板的缓存目录中(项目模板路径的ProjectTemplates改为ProjectTemplatesCache 便是) </li> <li>完毕</li> </ol>

    Read more +
  • 17

    2018-05
    使用VS2010的Database项目模板统一管理数据库对象

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">使用VS2010统一管理数据库对象.</font> </td> </tr></tbody></table> <p align="center"><strong>使用VS2010的Database 项目模板统一管理数据库对象</strong></p> <p><strong>Visual Studio 2010</strong> 有一个数据库项目模板:<strong>Visual Studio Database Project</strong>(以下简称VSDP),VS 2003/2005/2008也有类似的项目,在VS2010上的得到了很大的加强,现在还具备了智能感知,构建时验证和自动部署功能,VSDP是针对典型的数据库开发任务而设计的,可以对原有数据库反向工程,添加表,存储过程和其他数据库项目,而且有选择性地将修改部署到目标数据库中。他的主要特性有:</p> <h5>1、模型对比(Schema Compare)</h5> <p>在项目的维护和升级期间,至少需要维护产品数据库(正在正式运营的数据库)、测试数据库、开发数据库这三个数据库,那开发数据库结构变更后,如何同步到其他两个数据库上呢?模型对比功能可以很好地解决此问题。如果开发数据库结构变更,可以通过选择菜单的Data → Schema Compare → Filter中选择Different Objects, Missing Objects or New Objects来过滤列表。这个过滤可以使我们快速地看到哪些修改需要更新到目标数据库中。然后我们可以保存修改脚本到一个文件中,并在T-SQL编辑器或者直接将修改精写入到目标数据库。</p> <h5>2、数据对比(Data Compare)</h5> <p>用来比较两个数据库的表或者视图中数据是否相同,可进行比较的前提是数据库名称一致、表具有相同的主键、唯一索引或唯一约束。比较完后可以对修改保存到目标数据库或者脚本。这个特性可以将产品数据库的数据导入到开发数据库或者测试数据库,以便于开发和测试。</p> <h5>3、数据生成计划(Data Generation Plans)</h5> <p>在项目中,开发团队每周至少一次提交版本到测试环境,测试人员针对新的数据结构如何快速生成测试基础数据呢? 数据生成计划会解决此问题。在数据生成计划计划中,我们要定义生成数据的表、每一个表要生成的记录行数和要插入数据的类型。数字类型比较容易生成,针对特殊的数据比如Email、电话号码可以通过正则表达式RegEx完成。</p> <h5>4、重构(Refactor)</h5> <p>主要用来重命名数据库对象,比如数据库名称,表名称,视图名称。当要重命名的对象改变后,对此对象的引用都会相应地改变。</p> <p>下面我们来看看这个项目模板的基本使用方法:</p> <p>在你的解决方案中添加项目,选择Database下的数据库模板,选择SQL Server 2008 Database Project,输入一个项目的名称,你也可以选择一个SQL Server 2005 Database Project。</p> <p><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507140.jpg" width="510" height="328"></p> <p>点击OK按钮后就在我们的解决方案里头里加入了数据库的工程:</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507141.jpg" width="379" height="325"></p> <p>现在可以通过我们数据库工程进行相关的数据库开发工作了,例如通过Tables节点管理数据库表的对象:</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507142.jpg" width="337" height="480"></p> <p>添加一个数据库表,例如我们现在要创建的一个表叫做Applications,右键选中Tables节点,选择添加一个Table</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507143.jpg" width="510" height="330"></p> <p>输入表的名称,点击Add按钮,一个数据库表的脚本就创建好了,通过修改表的脚本进行数据库表的开发,目前只能使用T-SQL,没有可视化的界面:</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507144.jpg" width="510" height="195"></p> <p>下面我们需要给这个表添加个主键,右键Tables节点下的Keys节点,选择添加一个Primiary Key</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507145.jpg" width="510" height="325"></p> <p>输入Key的名称,点击Add按钮,一个数据库表的主键的脚本就创建好了</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507146.jpg" width="510" height="197"></p> <p>现在我们要把创建好的表部署到我们的开发数据库:</p> <p>通过Build我们的数据库项目,VS2010会验证我们的数据库脚本并把database schema写到.dbschema扩展名的文件里:</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507147.jpg" width="510" height="181"></p> <p>部署脚本到数据库,右击项目,选择菜单项Deploy,VS会生成部署脚本:</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507148.jpg" width="510" height="139"></p> <p>然后就可以在你的开发数据库上运行部署脚本。但是如果你要确保你的开发数据库始终和你的开发过程同步,你可以设置你的数据库项目的属性,使得您的数据库的任何变化都会自动部署到开发数据库,双击数据库项目的属性,选择Deploy选项:</p> <p align="center"><img border="0" alt="image" src="http://www.webjx.com/files/allimg/100521/0507149.jpg" width="510" height="267"></p> <p>选择Deploy action,选择Create a deployment script (.sql) and deploy to the database,”。然后使用Edit按钮的目标连接设置连接到你的开发数据库。这时运行Deploy,就会把数据库脚本部署到你的开发数据库里了。</p>

    Read more +
  • 17

    2018-05
    .NET Compact Framework 的类库信息

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">有关.NET Compact Framework的类库信息.</font> </td> </tr></tbody></table> <p>启用本地帮助查看器中提供的特定筛选器。参考各个类型和成员附带的文档中的平台和版本信息,就可以获得 .NET Compact Framework 的类库信息。只有在 .NET Framework SDK 或 Visual Studio 2005 组合帮助集合的本地帮助查看器中才可使用这些筛选器。</p> <p>除了本地帮助查看器筛选器之外,类型和成员主题的几个部分还提供有关支持的设备平台、平台版本支持和平台特定的行为(在某些情况下)的信息。“平台”部分列出了“Windows Mobile for Pocket PC”、“Windows Mobile for Smartphone”和“Windows CE”。“Windows CE”包括除 Pocket PC 和 Smartphone 之外的运行 Windows CE 的设备。“版本信息”部分指示哪种版本的 .NET Compact Framework 支持某个特定的类型或成员。在“备注”部分的结尾,您将找到可能适用的任何平台注释,例如一个特定方法如何在移动设备平台上操作。</p> <p>有关 .NET Compact Framework 支持的所有设备平台和平台版本的列表,请参见支持的设备和平台。</p> <p>.NET Compact Framework 筛选器和智能设备开发筛选器</p> <p>可以用于显示 .NET Compact Framework 支持的命名空间、类型和成员的筛选器取决于您当前使用的产品。</p> <p>在 .NET Framework SDK 中,使用 .NET Compact Framework 筛选器。</p> <p>在 Visual Studio 2005 中,应使用智能设备开发筛选器。</p> <p>.NET Compact Framework 筛选器和智能设备开发筛选器执行以下操作:</p> <p>仅显示指南主题的 .NET Compact Framework 节点。</p> <p>仅显示包含由 .NET Compact Framework 支持的类型的命名空间。</p> <p>仅显示由 .NET Compact Framework 支持的命名空间中的类型。</p> <p>仅显示 .NET Compact Framework 支持的方法和构造函数重载。</p> <p>注意</p> <p>在有关方法和构造函数重载的各个主题中,“平台”部分中的移动设备平台信息是不准确的,将在以后的版本中进行更正。</p> <p>请注意,各个主题中的“版本信息”部分总会正确地指示 .NET Compact Framework 支持,这与“平台”部分中的错误或缺少的移动设备平台无关。</p> <p>使用 .NET Compact Framework 筛选器或智能设备开发筛选器</p> <p>在“帮助”中的“内容”或“索引”窗格之上,在“筛选依据”列表中选择“.NET Compact Framework”或“智能设备开发”。</p> <p>在成员摘要主题中进行筛选</p> <p>在列出某个类型的成员的主题中,您只能查看由 .NET Compact Framework 支持的那些成员。请注意,移动设备图标将指示 .NET Compact Framework 支持的成员。</p> <p>仅显示成员摘要主题中的 .NET Compact Framework 成员</p> <p>在成员摘要主题(如“AppDomain 成员”)中,单击主题顶部的非滚动区域中的“成员选项”。</p> <p>选择“仅 .NET Compact Framework 成员”复选框。</p>

    Read more +
  • 17

    2018-05
    IIS6下部署ASP.NET MVC应用程序

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">ASP.NET MVC在IIS6下部署的小技巧.</font> </td> </tr></tbody></table> <p>通常在IIS6下部署ASP.NET MVC应用程序的时候,都是直接设置把所有请求都交由ASP.NET的ISAPI处理。MVC是基于ASP.NET的,框架默认对于任何请求都会优先检查物理路径是否存在物理文件,如果存在的话就不通过MVC的路由机制,否则才走路由。</p> <p>因此,如果在不考虑控制静态资源权限的情况下,可以设置静态资源不通过ASP.NET的ISAPI,而直接由IIS处理,通过这种方式提升一些性能。本文围绕这个主题,详解部署过程。</p> <p>0.在设计MVC网站的时候,把静态资源统一放在一个文件夹下,建议目录结构使用小写字母</p> <p>1.把web应用程序发布到某个路径下(略)(顺便提一句,MVC2功能上比MVC3弱一些,用到的组件很少,可以直接私有部署System.Web.Mvc;但是MVC3因为功能增加,而且引入了Razor引擎,依赖的组件增多,建议在部署的时候直接安装MVC3)</p> <p>2.创建一个web站点(略)</p> <p>3.右击创建的web站点,选择属性,切换到Home Directory页</p> <p align="center"><img border="0" alt="clip_image001" src="http://www.webjx.com/files/allimg/110525/0730050.png" width="412" height="400"></p> <p>4.点击Configuration,在Wildcard application maps中,点击Insert,添加C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll,取消Verify that file existsg的勾选。(如果使用MVC2的话,可以到2.0下去找这个dll。这里去掉对静态文件的验证是关键,这使得asp.net处理所有的请求)</p> <p align="center"><img border="0" alt="clip_image001" src="http://www.webjx.com/files/allimg/110525/0730051.jpg" width="416" height="402"></p> <p>5.点OK</p> <p align="center"><img border="0" alt="clip_image001[6]" src="http://www.webjx.com/files/allimg/110525/0730052.png" width="412" height="454"></p> <p>6.允许ASP.NET 4.0扩展</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/0730053.jpg" width="570" height="294">&#160;</p> <p>7.content目录是静态资源放置的目录,设置content目录下请求直接由IIS处理以提高性能。右击content,属性</p> <p align="center"><img border="0" alt="clip_image001[6]" src="http://www.webjx.com/files/allimg/110525/0730054.jpg" width="405" height="377"></p> <p>8.点击create,再点击configuration,移除Wildcard application maps下的内容。点击OK。这里利用了IIS的一个bug,把目录设置成虚拟目录,删除Wildcard application maps的设置,这样这个虚拟目录的请求就直接由IIS处理了。</p> <p align="center"><img border="0" alt="clip_image001[8]" src="http://www.webjx.com/files/allimg/110525/0730055.png" width="403" height="443"></p> <p>9. 再点击Remove,把虚拟目录恢复成普通目录。这样只有这个目录下的文件会受到IIS的“眷顾”</p> <p align="center"><img border="0" alt="clip_image001[10]" src="http://www.webjx.com/files/allimg/110525/0730056.png" width="411" height="385"></p> <p>10.设置AppPool权限。点击站点使用的AppPool的属性,切换到Identity,选择Local System。这是偷懒的设置方法,以避免出现应用程序本身对系统的访问权限不够</p> <p align="center"><img border="0" alt="clip_image001[14]" src="http://www.webjx.com/files/allimg/110525/0730057.png" width="399" height="376"></p> <p>11.设置匿名访问权限。右击站点,选择权限。点击Add…,在弹出的对话框中输入IUSR_XXX(XXX为机器名)。</p> <p align="center"><img border="0" alt="clip_image001[16]" src="http://www.webjx.com/files/allimg/110525/0730058.png" width="494" height="266"></p> <p>点击OK,便可添加一个Internet Guest Account,保持默认的只读权限即可。</p> <p align="center"><img border="0" alt="clip_image001[18]" src="http://www.webjx.com/files/allimg/110525/0730059.png" width="402" height="484"></p> <p>12.最后注意,如果是首次安装.NET 4.0,不要忘了注册</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/07300510.jpg" width="550" height="160">&#160;</p> <p>在深入理解ASP.NET MVC(2)中,讨论过MVC框架的路由机制,其中提到“可以通过设置RouteCollection的RouteExistingFiles为true,使得路由不匹配静态文件(注意true是不匹配,这个命名和奇怪)。”因此,我们可以这样设置,以使得MVC不对静态文件进行检查,这样又可以提高一点性能。最终请求会像下图那样被serve</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110525/07300511.jpg" width="225" height="183">&#160;</p>

    Read more +
  • 17

    2018-05
    ASP.NET性能的优化:网站优化需要考虑的方面

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">构建高性能ASP.NET站点 网站优化需要考虑的方面.</font> </td> </tr></tbody></table> <p>导读:作者燕洋天写了一系列关于ASP.NET的文章。我有段时间没有写ASP.NET的东西了,心里总是觉得缺少了什么,毕竟自己对ASP.NET还是情有独钟的。在本系列文章中,准备比较全面的讲述ASP.NET的性能的优化,从前台到后台,以后本列文也看作为大家的一个手册来查询!以下是文章内容:</p> <p><strong>网站优化需要考虑的方面</strong></p> <p>在用ASP.NET开发网站的时候,性能是永远需要考虑和关注的问题,性能不仅仅只是程序代码执行时候的速度,而是涉及到方方面面的东西。</p> <p>就拿ASP.NET的一个请求来讲,从浏览器向服务器的ASP.NET网站发送请求开始一直到最后整个页面呈现在我们面前,其中请求经过的每一个步骤,都是有不同的调优方式的,而且调用的方法也很多,不仅仅只是常见的:缓存,多线程,异步等。</p> <p>本系列的文章决定从两个大的方面来讲述调优:</p> <p>前台调优:主要包含如何尽量的减少http请求,从http请求开始,到如何加载js, css,如何压缩传输的数据等。</p> <p>后台调优:分析ASP.NET请求的处理过程,并在每一步给出相应的调优方法,而且在代码组织,架构和数据库的操作上面给出调优的方法。</p> <p>记得在刚刚开发网站的时候,一提到提高性能,最容易也是最快想到的就是缓存,而且在微软官方的Best Practice的一些文档中也是建议:层层缓存(在数据存储层,DAL,BLL,UI等都要缓存)。然后在网站中就”缓存遍地开花”,最后的确实不尽人意。</p> <p>另外的一个常见的优化针对数据库的:如尽量减少子查询,使用join联接;在常常需要查询的字段上面建立索引。确实,这些是很通用,也不错的一些规则。</p> <p>而且还有一个体会就是,在优化性能的时候,如果选择优化代码和数据库,往往优化数据库的一些操作带来的效果会更加的好,很可惜的是:在项目中(至少在我开发的一些项目中),数据库仅仅就只是一个数据的存储设备而已,仅此而已,没有发挥出数据库的强大作用。所以还是建议对数据库的内部查询和存储的机制要熟悉,毕竟很多时候开发人员也担任了DBA的工作(很多公司没有正式的DBA)。</p> <p>而且在项目中我们设计数据库的时候,特别是表字段的时候,是需要有些考虑的,很多人建议表字段的长度不要太长,这也是大家常见的建议,但是为什么?其实,这就需要懂得一些数据库的内部存储机制了:在数据库(SQL SERVER )保存的时候,数据是以”页”为最小的单位的,每一页有8K的大小,如果你的一个表中的数据超过8K,那么这个表的数据就要分几个页面保存,这样在对数据进行查询的时候,就要跨页查询了,跨页是需要性能消耗的,如果数据都在一个页面上,那么速度肯定快些。</p> <p>所以,要优化网站,就得知道性能消耗在哪里。</p> <p><strong>当优化的一个网站的时候,不是盲目的一概而论的,一般来说有两种情况:</strong></p> <p>1、网站已经存在了,并且运行了,现在要优化。</p> <p>2、正在从头开发一个新的网站。</p> <p>如果是第一种情况,那么首先要找出网站性能的瓶颈,从前台的请求的到后台的请求处理,一直到最后页面的呈现,都要一步步的审查。</p> <p>如果是第二种情况,可能情况就稍微好一点,并且网站现在完全由我们控制,所有在开发和设计的过程中就可以采用很多的优化原则来优化。</p> <p>优化不一定就是代码重写或者做些很大的改动,优化时一点点的累积的,就好比代码的重构一样,都是一个积累的效果。比如,是在页面一开始的时候载入js脚本,还是在整个页面的最后载入js脚本,有时候往往就只是简单的调整一下载入的文件,或者异步的载入脚本,或者通过CDN传输脚本等等方法,性能就提升了。性能的提升也不是没有代价的,有的代价很小,例如只是把脚本的载入放在页面最后,大的代价就是,例如买些服务器设备,如Content Delivery Network(CDN)来把静态的文件(js,css,image)传送到客户端。所以说,优化需要权衡策略。</p> <p>不知道大家是否有过这样的体会:当看着自己开发出来的系统性能很好的时候,自己是很自信的,相反,如果系统很慢,有时真不想说这个系统是自己做的。</p>

    Read more +
  • 17

    2018-05
    微软.NET:为什么叫.NET的一些答案收集

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">.NET为什么被叫做.NET.</font> </td> </tr></tbody></table> <p>微软最初是在上世纪九十年代末开始开发.NET,最初.NET还不是叫做.NET,而是“Next Generation Windows Services” (NGWS)。那微软又为什么给它改名叫做.NET呢?这个奇怪的名字甚至非常不方便搜索引擎来索引。</p> <p>微软为什么会改名本身就是一个谜,下面是我收集的最可靠的答案:</p> <p>●.NET让微软的销售人员首次可以向大众宣布自己也拥有了自己的网络技术,当然也是为了对抗当时宣称 “The network is the computer”的Sun Microsystems的闪电战。另一方面,当时“.com”也几乎是网络的代名词,而“.NET”则是对它的模仿。当然我并不认为这个名字有什么问 题,问题在于微软给太多产品使用了“.NET”这个前缀,比如“.NET My Services” 和“.NET Enterprise Servers”,但后者与Internet几乎没有任何关系!这些都造成了很多困惑,以至于后来微软将.NET限制为管理软件框架相关技术专用命名。 &#8212;&#8212;Stanley Siu</p> <p>●当时我正是微软的一名开发人员,但我也不确定到底是哪个蠢货给它定的名字!所有我交流过的人都不认为它是个好名字,无论是从什么角度来看!但相比于NGWS,它至少能够读得出来。&#8212;&#8212;George V. Reilly(微软资深工程师)</p> <p>●早期市场部认为这是一套Web服务。.NET被“假定”是用来简化设计和使用Web服务的工具。甚至 它还被“假定”为一个简单的调用微软即将提供的服务,然后每个人都可以简单地使用“.NET My Services”了。当然,很快大家都发现这是一个误会,但.NET这个名字还是传下来了,至少它比“COM++”和“ActiveXX”感觉要好。 &#8212;&#8212;John Saunders(微软MVP)</p> <p>这个问答前几天还存在于StackOverflow这个技术问答论坛上,但最近被认为不符合网站主题(它不是技术问题)被删除了。但又不知道为什么,StackOverflow又恢复了这个Q&amp;A,大家现在可以在这里查看所有回答。</p>

    Read more +
  • 17

    2018-05
    降低.NET应用程序内存占用的实践和总结

    <p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">我对降低.NET应用程序内存占用的一点儿实践和总结,希望对您有所帮助。</font> </td> </tr></tbody></table> <p>最近一周比较忙,主要的工作内容是在做一个叫“键盘精灵”的东西,简单来讲就是将很多数据放到内存中,对这些数据进行快速检索,然后找出根据输入条件最匹配的10条记录并予以展示。具体和下面两款炒股软件的相关功能类似:</p> <p style="TEXT-ALIGN: center"><img style="TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; MAX-WIDTH: 100%; HEIGHT: auto; COLOR: transparent; FONT-SIZE: 0px; VERTICAL-ALIGN: middle; PADDING-TOP: 0px" class="wp-image-35673 size-full aligncenter" title="减少.NET应用程序内存占用的一则实践" border="0" alt="减少.NET应用程序内存占用的一则实践" src="http://www.webjx.com/files/allimg/130313/1123580.png"></p> <p>数据以文本形式存在文件中,且数据量较大,有近20万条,每一条记录有几个字段,以分隔符分割。当时使用的是6万条记录的测试数据,文本文件将近10M,这个模块加载到内存并建立缓存之后,大概会占用将近70-80M的内存。自我接手以后,主要的任务就是降低内存消耗和提高匹配效率。</p> <p><strong>一、</strong><strong>避免创建不必要的对象</strong></p> <p>拿到代码后,第一步就是看设计文档,然后断点一步一步的看代码,大概明白了逻辑之后,发现思路有一些问题。之前的代码处理流程思路大概是下面这样的:</p> <p>1.将文件读取到内存,实例化</p> <p>2.根据条件对文件进行检索,并存储到结果集1中</p> <p>3.对结果集1中的结果进行匹配度计算,并存储到结果集中2</p> <p>4.按对结果集2进行匹配度排序,取最匹配的10条记录,然后返回</p> <p>这个过程中规中矩。但是其中有很多问题,最大的问题是,临时变量存储了太多的中间处理结果,而这些对象在一次查询完成后又马上丢弃,大量的临时对象带来了很大的GC压力。举例来说,当用户在输入框中输入1的时候,假设使用Contains来匹配,那么从6万条记录中找出包含1的记录可能有4万多条,然后需要把这4万多条记录存储在临时变量中进行处理,进一步计算这4万条记录的匹配度,然后存储到一个类似KeyValuePair的集合中,key为匹配度,然后对这个集合按Key进行排序,然后取前10条最优记录。可以看到,中间创建了大量的临时变量,使得内存剧增,大量临时对象创建之后马上会被回收,GC压力山大。</p> <p>而在设计文档中,只要求返回最最匹配的10条记录,之前的解决方案中似乎并没有注意到这一点。所以接手后,第一步就是对上面的处理过程进行精简。精简后如下:</p> <p>将文件读取到内存,实例化</p> <p>根据条件对文件进行检索,如果存在,则:</p> <p>计算匹配度。</p> <p>以匹配度为Key,存储到只有11个容量的SortList中。</p> <p>如果SortList集合添加记录后大于10个,则移除最后面一个元素,始终保持着前10个最小(匹配度最优)的记录。</p> <p>遍历完成之后,返回这个集合对象</p> <p><span style="LINE-HEIGHT: 24px; TEXT-INDENT: 2em; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 14px">经过这一修改,减少了大量临时数据对内存的占用,整个过程中,我只是使用一个容量为11的SortList结构存储中间的过程,每一次插入一个元素,SortList帮我们排好序,然后移除最不匹配的那一个,也就是最后一个元素(从小到大排序,越匹配,值越小)。这里面的消耗主要是SortList的插入,内部排序和移除记录。 说到这里在选择SortList还是SortDictionary的问题上纠结了一下,于是又找了些资料,SortDictionary在内部使用红黑树实现,SortList采用有序数组实现, 在内部排序都为O(logn)的前提下,SortDictionary的O(logn)插入及删除元素的时间复杂度优于SortList,但是SortDictionary会比SortList占用更多内存。基本来说这是一个查询速度和内存分配之间的平衡,由于这里只需要存储11个对象,所以两者相差不大。其实即使没有这种结构,自己也可以实现的,无非就是一个集合,每次添加一个,排好序,然后将最大的那个移除。.NET使用起来方便是因为有很多这些强大的内置数据结构。</span></p> <p style="TEXT-ALIGN: center"><img style="TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; MAX-WIDTH: 100%; HEIGHT: auto; COLOR: transparent; FONT-SIZE: 0px; VERTICAL-ALIGN: middle; PADDING-TOP: 0px" class="wp-image-35674 size-full aligncenter" title="减少.NET应用程序内存占用的一则实践" border="0" alt="减少.NET应用程序内存占用的一则实践" src="http://www.webjx.com/files/allimg/130313/1123581.png"></p> <p>经过上面这个小小的修改,内存占用一下子降低了1倍,从原来的70-80M,降低到了30-40M,其实这就是降低内存开销的一个最基本的原则,那就是避免创建不必要的对象。</p> <p><strong>二、</strong><strong>优化数据类型及算法</strong></p> <p>越到后面内存的降低越来越困难。仔细看了代码之后,除了上面之外,代码中也有一些其他问题,比如,一开始就将大量的对象实例化到内存中,然后一直保存。每一条记录中的信息比较多,但真正有用的用于搜索匹配的只有下面四个字段,但是整体的实例化会将其他没有用的字段也一并序列化进去了。导致很多内存被无用的字段占用。</p> <p>“股票代码 股票中文名 中文拼音 市场类型 ……</p> <p>600000 浦发银行 PFYH 上证A股 ……”</p> <p><span style="LINE-HEIGHT: 24px; TEXT-INDENT: 2em; FONT-FAMILY: Arial, sans-serif; FONT-SIZE: 14px">所以第一步就是在内存中只存放需要检索的上面四个关键字段,每一条记录刚开始是使用string[]数据,而不是使用类或者其它结构来保存,也尝试使用结构提来保存,但是由于四个字段,数据量大,中间还要作为参数传递,所以比使用类还大,这里只是简单的使用了数组。</span></p> <p>除了上面这些之外,为了提高搜索效率,对数据按照0-9,a-z开头对数据做了切分分块缓存,这样当用户输入0时,直接从以0为key的块中读取数据,这样速度是加快了,但是大量的缓存也增加了对内存的消耗。缓存的数据基本上和加载到内存中原始的数据一样大了。并且在搜索的过程中,也是采用的<strong>完全</strong>搜索,对于17万条数据的四个字段,每一次查询要进行170000*4次遍历比较,才能找出最匹配的10条数据来。</p> <p>为此,引入了<strong>不完全</strong>搜索,就是事先对各类型证券,如 股票,基金,债券分类,对每一类按证券代码进行排序。当用户设置了搜索的优先级时,依次在每一类中查找,如果找到满足条件的10条记录,则立即返回,因为数据已经事先按照证券类型和代码排好序了,所以后面找到的肯定没有之前找到的匹配度高,这一改进直接提高了搜索查询的效率。<strong>对有序的数据进行查找效率一般会比无序的数据查找效率高</strong>。我们常见的一些查找算法,比如说,二分查找法,前提也是待查找的集合有序排列。</p> <p>三、<strong>采用非托管代码或者模块编写数据处理逻辑</strong></p> <p>上面的两部操作虽然减少了将近50-60%的内存占用,但是仍然达不到领导的要求,于是又尝试并比较了各种 使用不同的数据结构将数据载入到内存中的内存占用大小,包括直接将文件按类型读成字符串、数组、结构及类,内存占用最小的直接将文件读成字符串,10M的数据文件读进内存也会占用20-30M的空间,还不谈对其进行处理过程中产生的一些临时变量对内存的占用。使用dotTrace及CLR Profile等工具检查之后,发现内存的占用也是这些原始数据。然后以” How to reduce the memory usage of .NET applications” 到网上搜了一下减少.NET内存占用的一些方法,在StackOverflow上看到了这一回答:</p> <p style="TEXT-ALIGN: center"><img style="TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; MAX-WIDTH: 100%; HEIGHT: auto; COLOR: transparent; FONT-SIZE: 0px; VERTICAL-ALIGN: middle; PADDING-TOP: 0px" class="wp-image-35678 size-full aligncenter" title="减少.NET应用程序内存占用的一则实践" border="0" alt="减少.NET应用程序内存占用的一则实践" src="http://www.webjx.com/files/allimg/130313/1123582.jpg"></p> <p>该同学指出.NET应用程序和其他使用本地代码编写的程序相比会有较大的内存占用,如果对内存开销比较在意,.NET可能不是最好的选择。.NET应用程序的内存一定程度上受垃圾回收的影响。并指出,一些数据结构如List,系统会分配多余的空间。可以使用值类型而不是引用类型,不要创建大对象,以免产生内存碎片等等降低内存占用的建议。</p> <p>这些都考虑过之后,内存还是达不到要求,所以开始寻找调用非托管代码的方式来自己更灵活的控制内存的分配与销毁。但是整个程序都是采用.NET编写的,全部切换成C或者C++不现实,所以只有两种方案,一是使用unsafe 代码,二是将数据加载和检索模块采用C或者C++编写,在.NET中采用P/Invoke技术调用。</p> <p>刚开始想采用unsafe代码,对数据的加载及检索直接在放在unsafe 代码中。后来觉得代码有些乱,不同风格的代码混杂在一起不太好,而且数据加载和检索的逻辑也比较复杂。所以就直接采用第二种方案,使用C++编写数据加载和检索逻辑。然后在.NET里面调用。</p> <p>在开始之前,也做了一些评估,比如将同样的10M的数据加载到内存中,都采用字符串的方式存储,.NET中会占用20-30M的内存,而在C++中只有9-10M的样子,而且变动很小。这正是需要的结果。</p> <p>由于对C++不熟,临时抱佛脚,翻了下C++ Primier Plus中关于字符串和STL的相关章节,并请求其他开发小组给予了一定的协助,定义了基本的接口。为了演示,我创建了两个工程,一个是名为SecuData的C++ Win32 DLL工程,一个是测试该类库的名为SecuDataTest的C# WinForm程序。</p> <p>我在C++中定义好了4个方法,一个初始化加载数据,一个设置搜索优先级,一个查找匹配方法和一个卸载数据方法,具体的算法由于工作原因不便贴出,这里只是举一个简单的例子,方法名及工程结构如下图:</p> <p style="TEXT-ALIGN: center"><a class="bPic" href="/files/allimg/130313/1123583.png" jquery1363142958686="5"><img style="TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 600px; PADDING-RIGHT: 0px; MAX-WIDTH: 100%; HEIGHT: auto; COLOR: transparent; FONT-SIZE: 0px; VERTICAL-ALIGN: middle; PADDING-TOP: 0px" class="wp-image-35676 size-full aligncenter" title="减少.NET应用程序内存占用的一则实践" border="0" alt="减少.NET应用程序内存占用的一则实践" src="http://www.webjx.com/files/allimg/130313/1123583.png"></a></p> <p>然后再在.NET中使用P/Invoke技术引入C++ DLL中定义的方法。</p> <p style="TEXT-ALIGN: center"><a class="bPic" href="/files/allimg/130313/1123584.png" jquery1363142958686="6"><img style="TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 600px; PADDING-RIGHT: 0px; MAX-WIDTH: 100%; HEIGHT: auto; COLOR: transparent; FONT-SIZE: 0px; VERTICAL-ALIGN: middle; PADDING-TOP: 0px" class="wp-image-35677 size-full aligncenter" title="减少.NET应用程序内存占用的一则实践" border="0" alt="减少.NET应用程序内存占用的一则实践" src="http://www.webjx.com/files/allimg/130313/1123584.png"></a></p> <p>这样就可以在.NET中调用这些方法了,需要说明的是,方法的传入值这里是使用String类型的,第二个StringBuilder类型的参数是方法的真正返回值,方法的整体int型返回值表明方法是否执行成功。在调用查找方法时,第二个StringBuilder参数必须初始化一个最大的查询结果的大小,因为在C++中会往这个对象中写入结果,不初始化或者初始化太小都会抛出异常。当然也可以直接返回结构体,这个就需要额外定义,这里返回的都是字符串。完了自己在.NET里面对其进行解析。</p> <p>需要注意的是,调试的时候,如果需要调试C++里面的代码,需要指定DLL的生成目录及启动目标,并且将C++项目设置为启动项目,这里我设定生成DLL的目录为SecuDataTest项目生成的SecuDataTest.exe文件所在的目录,调试启动目标设置为SecuDataTest.exe,这样在C++项目中设置断点,启动.NET Winform程序,当P/Invoke触发断点时能够逐步调试C++代码。</p> <p>在发布的时候,最好将默认的动态库配置修改为静态库,这样VS会把依赖的相关C++库打包到生成的dll中,部署到客户机器上不会出现问题。SecuData类库项目的属性设置如下图:</p> <p style="TEXT-ALIGN: center"><a class="bPic" href="/files/allimg/130313/1123585.jpg" jquery1363142958686="7"><img style="TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 600px; PADDING-RIGHT: 0px; MAX-WIDTH: 100%; HEIGHT: auto; COLOR: transparent; FONT-SIZE: 0px; VERTICAL-ALIGN: middle; PADDING-TOP: 0px" class="wp-image-35679 size-full aligncenter" title="减少.NET应用程序内存占用的一则实践" border="0" alt="减少.NET应用程序内存占用的一则实践" src="http://www.webjx.com/files/allimg/130313/1123585.jpg"></a></p> <p>改成这种P/Invoke模式之后,10M数据载到内存中,内存占用只有10M左右,较之前采用.NET的30-40M的内存又降低了很多,而且内存波动比较小,满足了对内存占用的要求。</p> <p>采用这种“混搭”方式有一些好处,既有.NET的快速开发,又有C++的灵活的内存分配销毁模式以及代码安全性保护。在很多时候,可以将一些对内存占用比较敏感,大数据量的处理逻辑,放在C++中处理,利用灵活的手动内存管理模式降低这部分的内存占用;将核心的数据结构及算法使用C++编写,可以提高代码的安全性,提高程序的反编译难度。</p> <p><strong>四、</strong><strong>结语</strong></p> <p>.NET应用程序由于需要加载CLR及一些通用类库,并且具有垃圾收集机制,较其他本地语言如C,C++具有较大的footprint,使用.NET创建一个简单的Winform可能就会占用近10M的内存,所以随着开发的进行,内存占用会比较大。当然这些在很多时候是由于开发者自身对.NET底层机制不熟悉,比如在有些地方可以使用值类型而使用引用类型;创建了大量的临时的周期比较短的对象;使用了过多的静态变量及成员导致内存被长久占用而得不到回收;以及.NET内部的一些机制,比如集合对象会在内部预先分配多余的空间等等。很多时候因为有.NET的GC机制,使得我们不必去关注对象的销毁而很”大方”的去创建新对象,去使用一些重型的内置对象,从而导致内存占用过大。解决好这些问题,其实可以降低.NET应用程序的相当大一部分的不必要的内存占用。</p> <p>除了了解.NET框架的一些内部机制之外,良好的思路,高效数据结构和算法也可以使得问题变得简单而减少内存的开销。</p> <p>最后对于对内存要求比较敏感,可以利用C/C++的手动的灵活的内存管理语言来编写相应模块,在.NET中采用P/Invoke技术进行调用来减少一些内存。</p> <p>以上是我对降低.NET应用程序内存占用的一点儿实践和总结,希望对您有所帮助。</p>

    Read more +