<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Killmyday</title><subtitle type="text">只关注技术</subtitle><id>http://feed.cnblogs.com/blog/u/53161/rss</id><updated>2012-04-15T04:19:15Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/53161/rss"/><entry><id>http://www.cnblogs.com/killmyday/archive/2012/04/15/2450108.html</id><title type="text">我对自动化测试工程师招聘的建议</title><summary type="text">给以前公司招聘人员做的一个培训:/Files/killmyday/2011年PTA测试培训课件.zip</summary><published>2012-04-15T04:19:00Z</published><updated>2012-04-15T04:19:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2012/04/15/2450108.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2012/04/15/2450108.html"/><content type="html">&lt;p&gt;给以前公司招聘人员做的一个培训:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://files.cnblogs.com/killmyday/2011%E5%B9%B4PTA%E6%B5%8B%E8%AF%95%E5%9F%B9%E8%AE%AD%E8%AF%BE%E4%BB%B6.zip"&gt;/Files/killmyday/2011年PTA测试培训课件.zip&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2450108.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2012/04/15/2450108.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2012/03/01/2375130.html</id><title type="text">应用程序调试技术视频各集技术概述</title><summary type="text">这是第一部分，Windows平台下的应用程序调试技术讲座视频，视频购买地址：http://product.china-pub.com/3502590视频试听地址:http://v.youku.com/v_show/id_XMzU4OTUzNzAw.html第1讲准备调试环境 调试符号文件的作用； 创建符号文件的方法； 在调试器里有无符号文件的区别； 公开符号版本和私有符号版本的区别； 创建公开符号文件的方法； 了解符号文件服务器的作用； 掌握在Visual Studio以及Windbg里使用符号文件的方法； 了解无法调试程序时的排错步骤。第2讲管理符号文件与源代码 创建符号文...</summary><published>2012-03-01T02:34:00Z</published><updated>2012-03-01T02:34:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2012/03/01/2375130.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2012/03/01/2375130.html"/><content type="html">&lt;p&gt;这是第一部分，Windows平台下的应用程序调试技术讲座视频，&amp;nbsp;视频购买地址：&lt;/p&gt;&lt;p&gt;&lt;a href="http://product.china-pub.com/3502590" style="color: #8e1a10; font-family: Verdana; text-align: left; background-color: #ffffff; "&gt;http://product.china-pub.com/3502590&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;视频试听地址:&amp;nbsp;&lt;a href="http://v.youku.com/v_show/id_XMzU4OTUzNzAw.html"&gt;http://v.youku.com/v_show/id_XMzU4OTUzNzAw.html&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 15px; text-align: left; background-color: #ffffff; font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-size: 15px; text-align: left; background-color: #ffffff; font-family: Calibri; "&gt;1&lt;/span&gt;&lt;span style="font-size: 15px; text-align: left; background-color: #ffffff; font-family: 宋体; "&gt;讲&lt;/span&gt;&amp;nbsp;&lt;span style="font-size: 15px; text-align: left; background-color: #ffffff; font-family: 宋体; "&gt;准备调试环境&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;调试符号文件的作用；&lt;/div&gt;&lt;div&gt;创建符号文件的方法；&lt;/div&gt;&lt;div&gt;在调试器里有无符号文件的区别；&lt;/div&gt;&lt;div&gt;公开符号版本和私有符号版本的区别；&lt;/div&gt;&lt;div&gt;创建公开符号文件的方法；&lt;/div&gt;&lt;div&gt;了解符号文件服务器的作用；&lt;/div&gt;&lt;div&gt;掌握在Visual Studio以及Windbg里使用符号文件的方法；&lt;/div&gt;&lt;div&gt;了解无法调试程序时的排错步骤。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 宋体; "&gt;管理符号文件与源代码&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;创建符号文件服务器；&lt;/div&gt;&lt;div&gt;调试时集成符号文件服务器和源代码版本控制服务器，以便调试时，调试机不需要有程序的源代码，调试器会自动从源代码服务器上下载正确的版本。讲解了集成SVN和Visual SourceSafe两种版本服务器的方法，这样方便一个大型研发团队进行每日编译（daily build）式的开发测试环境。如果跟第26讲（验尸调试）结合来看的话，甚至可以在团队局域网内部建立一个自动的BUG收集服务器，跟符号服务器、源码服务器配合组成一个随时随地的BUG跟踪和分析系统。&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: Calibri; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;3&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;&amp;nbsp;Visual Studio&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;基本调试技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Calibri; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 断点的实现原理；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 条件断点以及跟踪断点；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 函数断点以及异常断点；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 原生程序设置数据断点；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; VS提供的各个调试窗口简介；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调试浮点数计算错误的方法。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;4&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;&amp;nbsp;Visual Studio&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;调试技术中&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Calibri; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 在程序启动和异常终止时附加调试器；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 设置远程调试；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 使用RPC调试功能同时调试COM程序的客户端和服务器端；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 在立即窗口里调试刚刚写好的函数；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; SQL调试技术，即在ASP.NET网站或者ADO.NET程序中，单步跟进数据库存储过程等一系列数据库调试技巧。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;5&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;&amp;nbsp;Visual Studio&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;自动化调试及并行调试&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Calibri; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 在C++和.NET程序里添加调试支持，方便调试器在调试的时候收集信息；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 使用Visual Studio的自动化接口编写自动化调试脚本；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调试并行代码，分析性能瓶颈&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;6&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;&amp;nbsp;Windbg&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;基本功能介绍&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Calibri; "&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 作业讲解里有调试WPF程序，分析WPF程序性能瓶颈的方法；&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Windbg的基本调试命令讲解，设置断点，加载符号文件，查看内存等基本命令&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;7&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 宋体; "&gt;调试栈溢出问题（上）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;调试栈溢出问题（下）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 两个视频是连续的。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 从汇编的角度以及实际函数调用过程讲解了栈的实现，以及调用函数时的创建栈和释放栈的过程；&lt;/p&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 内存溢出问题的调查步骤；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 栈溢出病毒攻击的原理；&lt;/div&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调试栈溢出问题的方法；&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; C++各种调用规范（Calling Convention）的讲解以及相关函数调用演示；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 在.NET里调用使用不同调用规范的函数；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调用规范不匹配导致栈溢出的调查方法；&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 防范栈溢出的措施。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;9&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;调试堆溢出问题（上）&lt;/span&gt;&lt;span style="background-color: #ffffff; font-family: Verdana; font-size: 11pt; text-align: left; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;10&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲调试堆溢出问题（中）&lt;/span&gt;&lt;span style="background-color: #ffffff; font-family: Verdana; font-size: 11pt; text-align: left; "&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;11&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲调试堆溢出问题（下）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 三个视频是连续的&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; CRT调试堆的实现；&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;使用CRT调试堆检查堆溢出问题&amp;nbsp;；&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 从系统内核的角度讲解Windows内存堆的实现，以及演示堆里面内存的分配和释放过程；&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 堆溢出的原理讲解&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调试堆溢出的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调试释放内存时使用了错误的堆句柄这个错误的方法&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 调试使用未初始化内存问题的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;12&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲调试资源泄露问题（上）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;13&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲调试资源泄露问题（下）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;两个视频是连续的&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试堆内存泄露这个很常见的编程错误&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试进程内和进程间句柄泄露的方法&amp;nbsp;&lt;/p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;在MFC里检查内存泄露的办法&amp;nbsp;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试JavaScript里内存泄露&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;14&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲调试多线程问题（上）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;15&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲调试多线程问题（下）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;两个视频是连续的&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试多线程间数据竞争的问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;在多线程里添加调试支持&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试用户态线程同步死锁问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试内核态线程同步死锁问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试竞争锁资源问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试使用CPU资源过多的问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;多线程编程的注意事项&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第16讲内核调试与托管程序调试准备工作（上）&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试Windows内核的方法，以及设置源代码级内核调试的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; text-align: left; "&gt;&lt;strong&gt;第17讲内核调试与托管程序调试准备工作（下） &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 在windbg里调试.NET程序的方法及原理&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 在windbg里调试.NET虚拟机CLR的方法，以及设置源代码调试的步骤&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: Calibri; "&gt;18&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: Calibri; "&gt;CLR&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: 宋体; "&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: Calibri; "&gt;-&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: 宋体; "&gt;应用程序域和装配件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解应用程序域（AppDomain）的知识以及它的使用场景&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解装配件（Assembly）的知识&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解在调试器里查看AppDomain和Assembly信息的方法&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解在Assembly里混合C#、VB.NET以及Managed C++代码的方法，以及调试这种模块的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;19&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;CLR&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;-&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;对象&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解对象（Object）在.NET虚拟机里的实现方式&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解在调试器里查看托管对象、数组内存布局的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解查看堆栈的方法&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;20&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;CLR&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;-&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;类型&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;讲解类型（Type）、泛型（Generics）和函数（Method）在.NET虚拟机里的实现方式&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;讲解在调试器里查看类型和函数内存布局以及信息的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解在windbg里调试托管程序设置断点的方法&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;21&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;CLR&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;-&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;线程&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解线程在.NET虚拟机里的实现方式&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解在调试器里查看线程信息的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解线程同步在.NET虚拟机里的实现方式，以及在调试器里查看同步信息的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解线程池的实现方式以及在调试器里查看相关信息的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;22&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;CLR&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;-GC&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解垃圾回收（GC&amp;nbsp;）在.NET虚拟机里的实现方式；&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 查看GC相关信息的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 解释Close和Dispose函数的实现与区别&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解弱引用对象的原理和使用方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .NET里的内存管理技巧&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;23&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;CLR&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;-COM&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;互操作与异常&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 解释COM对象与.NET互操作的原理&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 解释.NET异常的实现原理&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;从.NET里使用COM对象的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;从COM里使用.NET对象的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 调试在.NET程序里使用COM对象出现问题时的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;24&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲托管调试其他工具（上）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 讲解sosex命令的使用方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 调试.NET程序死锁的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 调试.NET程序内存使用过多的方法，以及调试.NET程序内存的其他一些问题。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;25&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲托管调试其他工具（下）&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;讲解psscor命令的使用方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试ASP.NET页面访问速度过慢的问题&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;演示ASP.NET缓存的使用方法&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试因使用ASP.NET缓存而导致内存不够的问题的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;调试调用web服务出现OOM异常的方法&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;26&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;讲验尸调试&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;讲解验尸调试的原理，以及使用Visual studio、Windbg以及Adplus执行验尸调试的办法&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;设置企业内部用的自动收集错误报告服务器的方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: 宋体; "&gt;第&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: Calibri; "&gt;27&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: 宋体; "&gt;讲&lt;/span&gt;&lt;span style="background-color: #ffffff; font-size: 11pt; text-align: left; font-family: Calibri; "&gt;Windbg&lt;/span&gt;&lt;span style="font-size: 11pt; text-align: left; font-family: 宋体; background-color: #ffffff; "&gt;调试自动化&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;使用windbg提供的脚本语言编写调试用脚本程序的方法，实现自动化的程序调试。&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2375130.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2012/03/01/2375130.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2012/02/24/2365985.html</id><title type="text">应用程序调试技术视频观看指南</title><summary type="text">应用程序调试视频讲座观看购买指南。</summary><published>2012-02-23T23:22:00Z</published><updated>2012-02-23T23:22:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2012/02/24/2365985.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2012/02/24/2365985.html"/><content type="html">&lt;p&gt;这是第一部分，Windows平台下的应用程序调试技术讲座视频，&amp;nbsp;视频购买地址：&lt;/p&gt;&lt;a href="http://product.china-pub.com/3502590"&gt;http://product.china-pub.com/3502590&lt;/a&gt;&amp;nbsp;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体"&gt;对于&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;研发公司&lt;/span&gt;&lt;span style="font-family: Calibri; "&gt;IT&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;支持人员，项目或开发经理&lt;/span&gt;&lt;/strong&gt;，&lt;span style="font-family:宋体"&gt;设置事后可跟踪的&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;BUG&lt;/span&gt;&lt;span style="font-family:宋体"&gt;跟踪以及分析服务系统，建议选择观看&lt;/span&gt;&lt;span style="font-family:宋体"&gt;：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;准备调试环境&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;管理符号文件与源代码&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Windbg &lt;/span&gt;&lt;span style="font-family:宋体"&gt;基本功能介绍&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;26&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲验尸调试&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;知识准备：SVN、SourceSafe使用经验；简单C++/C#代码阅读经验；理解质量控制原则。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;编程初学者：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;准备调试环境&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Visual Studio&lt;/span&gt;&lt;span style="font-family:宋体"&gt;基本调试技术&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Visual Studio&lt;/span&gt;&lt;span style="font-family:宋体"&gt;调试技术中&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;5&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Visual Studio&lt;/span&gt;&lt;span style="font-family:宋体"&gt;自动化调试及并行调试&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;5&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、应用程序调试技术第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Windbg &lt;/span&gt;&lt;span style="font-family:宋体"&gt;基本功能介绍&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  知识准备：Visual Studio编程经验，VBScript编程能力，WPF编程，理解并行、多线程编程概念。&amp;nbsp;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:Calibri"&gt;Windows C++&lt;/span&gt;&lt;span style="font-family:宋体"&gt;，&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;MFC&lt;/span&gt;&lt;span style="font-family:宋体"&gt;程序员（&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;年编程经验）建议观看：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;准备调试环境&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Windbg &lt;/span&gt;&lt;span style="font-family:宋体"&gt;基本功能介绍&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;7&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;调试栈溢出问题（上）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;8&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;调试栈溢出问题（下）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;5&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;9&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;调试堆溢出问题（上）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲调试堆溢出问题（中）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;7&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;11&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲调试堆溢出问题（下）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;8&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;12&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲调试资源泄露问题（上）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;9&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;13&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲调试资源泄露问题（下）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;14&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲调试多线程问题（上）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;11&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;15&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲调试多线程问题（下）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;12&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;26&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲验尸调试&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;13&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;27&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;Windbg&lt;/span&gt;&lt;span style="font-family:宋体"&gt;调试自动化&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;  知识准备：熟悉Win32 C++编程，汇编，操作系统原理，熟悉虚拟内存管理，熟悉多线程编程，PowerShell，脚本编程能力。&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:Calibri"&gt;.NET&lt;/span&gt;&lt;span style="font-family:宋体"&gt;程序员（&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;年编程经验）建议观看：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;1&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt; &lt;span style="font-family:宋体"&gt;准备调试环境&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;2&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt; Windbg &lt;/span&gt;&lt;span style="font-family:宋体"&gt;基本功能介绍&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;3&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;18&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;CLR&lt;/span&gt;&lt;span style="font-family:宋体"&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;-&lt;/span&gt;&lt;span style="font-family:宋体"&gt;应用程序域和装配件&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;4&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;19&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;CLR&lt;/span&gt;&lt;span style="font-family:宋体"&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;-&lt;/span&gt;&lt;span style="font-family:宋体"&gt;对象&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;5&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;20&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;CLR&lt;/span&gt;&lt;span style="font-family:宋体"&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;-&lt;/span&gt;&lt;span style="font-family:宋体"&gt;类型&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;6&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;21&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;CLR&lt;/span&gt;&lt;span style="font-family:宋体"&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;-&lt;/span&gt;&lt;span style="font-family:宋体"&gt;线程&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;7&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;22&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;CLR&lt;/span&gt;&lt;span style="font-family:宋体"&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;-GC&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;8&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;23&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;CLR&lt;/span&gt;&lt;span style="font-family:宋体"&gt;虚拟机及托管调试命令&lt;/span&gt;&lt;span style="font-family: Calibri"&gt;-COM&lt;/span&gt;&lt;span style="font-family:宋体"&gt;互操作与异常&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;9&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;24&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲托管调试其他工具（上）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;10&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;25&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲托管调试其他工具（下）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;11&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;26&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲验尸调试&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Calibri"&gt;12&lt;/span&gt;&lt;span style="font-family:宋体"&gt;、第&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;27&lt;/span&gt;&lt;span style="font-family:宋体"&gt;讲&lt;/span&gt;&lt;span style="font-family:Calibri"&gt;Windbg&lt;/span&gt;&lt;span style="font-family:宋体"&gt;调试自动化&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;知识准备：熟悉.NET编程，熟悉.NET BCL，COM，汇编，操作系统原理，熟悉虚拟内存管理，熟悉多线程编程，PowerShell，脚本编程能力。&amp;nbsp;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;strong&gt;软件测试人员建议观看：&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;除了第16和17讲的所有视频&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;对于希望了解底层秘密的朋友，建议观看：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;1、第16讲内核调试与托管程序调试准备工作（上）&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;2、第17讲内核调试与托管程序调试准备工作（下）&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;p&gt;上面的名字起的有点随意，里面实际上解释了调试Windows 2003/XP内核和.NET虚拟机内核的方法，是源代码级别的。&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2365985.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2012/02/24/2365985.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/10/19/2218136.html</id><title type="text">VC 6中使用不同调用规范的函数在符号文件里的表示方式</title><summary type="text">描述老版本编译针对不同调用规范的函数的命名方式,在Visual Studio里设置函数断点的时候需要考虑到这一点。</summary><published>2011-10-19T12:04:00Z</published><updated>2011-10-19T12:04:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/10/19/2218136.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/10/19/2218136.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-family:宋体;"&gt;在以前老版本的&lt;/span&gt;C++&lt;span style="font-family:宋体;"&gt;编译器里，编译器会为使用不同调用约定（&lt;/span&gt;&lt;span&gt;&lt;a href="http://en.wikipedia.org/wiki/Calling_convention"&gt;Calling Convention&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;）的函数生成不同的名称，不仅是连接程序会遵从这个命名规则，调试器也会遵守这个命名规则。因此在&lt;/span&gt;Visual Studio&lt;span style="font-family:宋体;"&gt;里调试使用老版本编译器编译出来的程序，在设置函数断点的时候需要考虑到这个因素。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;下面是&lt;/span&gt;VC&lt;span style="font-family:宋体;"&gt;里面不同调用约定的函数命名规则：&lt;/span&gt;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="83" valign="top" style="width:61.9pt;border-top:solid black 1.0pt;border-left:solid black 1.0pt;border-bottom:none;border-right:none;background:black;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;color:white;"&gt;调用约定&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="110" valign="top" style="width:82.8pt;border:none;border-top:solid black 1.0pt;background:black;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;color:white;"&gt;参数压栈顺序&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="107" valign="top" style="width:80.45pt;border:none;border-top:solid black 1.0pt;background:black;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;color:white;"&gt;清理堆栈&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="255" valign="top" style="width:191.35pt;border-top:solid black 1.0pt;border-left:none;border-bottom:none;   border-right:solid black 1.0pt;background:   black;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;color:white;"&gt;函数命名规则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="83" valign="top" style="width:61.9pt;border:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;stdcall&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="110" valign="top" style="width:82.8pt;border-top:solid black 1.0pt;border-left:none;border-bottom:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;从右向左&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="107" valign="top" style="width:80.45pt;border-top:solid black 1.0pt;border-left:none;border-bottom:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;被调函数负责清理堆栈&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="255" valign="top" style="width:191.35pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;函数名加前缀&amp;#8220;&lt;/span&gt;_&lt;span style="font-family:宋体;"&gt;&amp;#8221;，并且在函数名后面附加&amp;#8220;&lt;/span&gt;@&lt;span style="font-family:宋体;"&gt;&amp;#8221;和堆栈要求分配的字节数。&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;示例：&lt;/span&gt;_TestMethod@4&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="83" valign="top" style="width:61.9pt;border:none;border-left:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;Cdecl&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="110" valign="top" style="width:82.8pt;border:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;从右向左&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="107" valign="top" style="width:80.45pt;border:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;调用函数负责清理堆栈&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="255" valign="top" style="width:191.35pt;border:none;border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;函数名加前缀&amp;#8220;&lt;/span&gt;_&lt;span style="font-family:宋体;"&gt;&amp;#8221;。&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;示例：&lt;/span&gt;_TestMethod&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="83" valign="top" style="width:61.9pt;border:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;Fastcall&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="110" valign="top" style="width:82.8pt;border-top:solid black 1.0pt;border-left:none;border-bottom:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;前两个参数由&lt;/span&gt;ECX&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;EDX&lt;span style="font-family:宋体;"&gt;传递，其他的从右向左压栈&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="107" valign="top" style="width:80.45pt;border-top:solid black 1.0pt;border-left:none;border-bottom:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;被调函数负责清理堆栈&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="255" valign="top" style="width:191.35pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;函数名后附加&amp;#8220;&lt;/span&gt;@&lt;span style="font-family:宋体;"&gt;&amp;#8221;和堆栈要求分配的字节数。&lt;/span&gt;&lt;/p&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;示例：&lt;/span&gt;TestMethod@4&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="83" valign="top" style="width:61.9pt;border-top:none;border-left:solid black 1.0pt;border-bottom:solid black 1.0pt;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;strong&gt;Thiscall&lt;/strong&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="110" valign="top" style="width:82.8pt;border:none;border-bottom:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;This&lt;span style="font-family:宋体;"&gt;指针由&lt;/span&gt;ECX&lt;span style="font-family:宋体;"&gt;寄存器传递，其他的从右向左压栈&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="107" valign="top" style="width:80.45pt;border:none;border-bottom:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;被调函数负责清理堆栈&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="255" valign="top" style="width:191.35pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:   0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;C++&lt;span style="font-family:宋体;"&gt;命令规则&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2218136.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/10/19/2218136.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/07/23/2115118.html</id><title type="text">破解XXX游戏驱动保护过程总结</title><summary type="text">刚刚接触软件破解还有驱动编写，好多东西都不熟，折腾了好久，把中间可能对大家有价值的过程记录下来。刚开始碰到的问题就是不能内核调试，因为要写驱动，需要用到。一般禁用内核调试都是在驱动里调用KdDisableDebugger，往上回溯一个函数，基本上就是驱动检测禁用是否成功的代码，否则就是一个循环不停的调用KdDisableDebugger函数。我的做法是修改KdDisableDebugger代码，这样不管什么时候被调用到，内核调试都不能被禁用，无非就是驱动那个死循环会导致机器卡死罢了，在KdDisableDebugger上设置一个断点，中断后，就把KdDisableDebugger和驱动的代码都</summary><published>2011-07-23T14:52:00Z</published><updated>2011-07-23T14:52:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/07/23/2115118.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/07/23/2115118.html"/><content type="html">&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #333333; font-family: Arial; line-height: 24px; "&gt;刚刚接触软件破解还有驱动编写，好多东西都不熟，折腾了好久，把中间可能对大家有价值的过程记录下来。&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;hr style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;刚开始碰到的问题就是不能内核调试，因为要写驱动，需要用到。一般禁用内核调试都是在驱动里调用KdDisableDebugger，往上回溯一个函数，基本上就是驱动检测禁用是否成功的代码，否则就是一个循环不停的调用KdDisableDebugger函数。&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;我的做法是修改KdDisableDebugger代码，这样不管什么时候被调用到，内核调试都不能被禁用，无非就是驱动那个死循环会导致机器卡死罢了，在KdDisableDebugger上设置一个断点，中断后，就把KdDisableDebugger和驱动的代码都改掉，然后禁用断点，继续内核的执行。我用的是下面这个命令做这段话说的事情：&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;bp KdDisableDebugger"eb nt!KdDisableDebugger+26 75;eb nt!KdDisableDebugger+41 75;ebTesSafe+5069 74;eb TesSafe+2703 75;bd 0;g"&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;hr style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;然后就是把驱动里hook的函数恢复，为了找到内核ssdt表里被hook的函数，看了网上的资料，有工具可以做这个事情，一是那些工具我都没有用过，不大会用，二是我想把内核里具体被inline hook的地址找出来，所以我就用了下面这个windbg脚本做这个事情，运行脚本之前需要记下eax, ebx, ecx的值，等脚本运行完成以后恢复。当然也可以用windbg里的伪寄存器，但是语法还有点不熟，就直接用现成的寄存器了，在启动游戏之前，先dump一下：&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;font face="simsun " style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;&lt;font size="2" style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;.logopen c:\logs\beforehook.txt &amp;nbsp;# 因为dump出来的东西比较多，就放到一个log里&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;font face="simsun " style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;&lt;font size="2" style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;r ebx = 0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 计数器&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;font face="simsun " style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;&lt;font size="2" style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;font face="simsun " style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;&lt;font size="2" style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;# 遍历ssdt表，把里面每个函数的汇编代码都dump出来，因为不知道每个函数的大小，所以每个函数都dump 1000行。&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;font face="simsun " style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;&lt;font size="2" style="outline-style: none; outline-width: initial; outline-color: initial; line-height: 1.5em; "&gt;r ecx=poi(nt!KeServiceDescriptorTable)&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;.for (r eax=ecx;@eax &amp;lt; ecx+0x474; reax=eax+4; rebx=ebx+1) { r ebx; u poi(@eax) L1000}&amp;nbsp;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;# 保存log&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;.logclose&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;接下来，游戏启动之后，再dump一次，用kdiff3做个对比就知道哪些函数被修改过了。&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;hr style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;看到被hook的函数以后，加上网上的资料，主要是参考看雪里的这篇资料：&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;a href="http://bbs.pediy.com/showthread.php?t=126802" target="_blank" id="url_1" style="outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; color: #0070af; "&gt;http://bbs.pediy.com/showthread.php?t=126802&lt;/a&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;hr style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;但是悲剧的是，有的时候修改了TX的代码，机器直接就重启了，参考看雪里另外一篇文章，把重启这个问题也解决了：&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;a href="http://bbs.pediy.com/showthread.php?t=129810&amp;amp;highlight=DNF" target="_blank" id="url_2" style="outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; color: #0070af; "&gt;http://bbs.pediy.com/showthread.php?t=129810&amp;amp;highlight=DNF&lt;/a&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;hr style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;很多都是大侠们已经研究了很透的东西，只是我比较愚笨，花了很多时间才搞明白整个过程，完整驱动的代码可以在我这个求助帖里找到：&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&lt;a href="http://www.ghoffice.com/bbs/read-htm-tid-91059.html" target="_blank" id="url_3" style="outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; color: #0070af; "&gt;http://www.ghoffice.com/bbs/read-htm-tid-91059.html&lt;/a&gt;&amp;nbsp;&lt;br style="outline-style: none; outline-width: initial; outline-color: initial; " /&gt;&amp;nbsp;&lt;/span&gt;&lt;font class="Apple-style-span" color="#333333" face="Arial"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2115118.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/07/23/2115118.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/05/31/2064171.html</id><title type="text">反调试技术二</title><summary type="text">继续前面的关于反调试技术的探讨。</summary><published>2011-05-31T03:40:00Z</published><updated>2011-05-31T03:40:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/05/31/2064171.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/05/31/2064171.html"/><content type="html">&lt;div&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;五、使用&lt;/span&gt;NtQueryInformationProcess&lt;span style="font-family: SimSun;"&gt;函数&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;NtQueryInformationProcess&lt;span style="font-family: SimSun;"&gt;函数是一个未公开的&lt;/span&gt;API&lt;span style="font-family: SimSun;"&gt;，它的第二个参数可以用来查询进程的调试端口。如果进程被调试，那么返回的端口值会是&lt;/span&gt;-1&lt;span style="font-family: SimSun;"&gt;，否则就是其他的值。由于这个函数是一个未公开的函数，因此需要使用&lt;/span&gt;LoadLibrary&lt;span style="font-family: SimSun;"&gt;和&lt;/span&gt;GetProceAddress&lt;span style="font-family: SimSun;"&gt;的方法获取调用地址，示例代码如下：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;// &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;声明一个函数指针。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: blue;"&gt;typedef&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt; NTSTATUS (WINAPI *NtQueryInformationProcessPtr)(&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE processHandle,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PROCESSINFOCLASS processInformationClass,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PVOID processInformation,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG processInformationLength,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULONG returnLength);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: blue;"&gt;bool&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt; NtQueryInformationProcessApproach()&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int&lt;/span&gt; debugPort = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;HMODULE hModule = LoadLibrary(TEXT(&lt;span style="color: #a31515;"&gt;"Ntdll.dll "&lt;/span&gt;));&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;NtQueryInformationProcessPtr NtQueryInformationProcess = (NtQueryInformationProcessPtr)GetProcAddress(hModule, &lt;span style="color: #a31515;"&gt;"NtQueryInformationProcess"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; ( NtQueryInformationProcess(GetCurrentProcess(), (PROCESSINFOCLASS)7, &amp;amp;debugPort, &lt;span style="color: blue;"&gt;sizeof&lt;/span&gt;(debugPort), NULL) )&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;printf(&lt;span style="color: #a31515;"&gt;"[ERROR NtQueryInformationProcessApproach] NtQueryInformationProcess failed\n"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; debugPort == -1;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;六、&lt;/span&gt;NtSetInformationThread&lt;span style="font-family: SimSun;"&gt;方法&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;这个也是使用&lt;/span&gt;Windows&lt;span style="font-family: SimSun;"&gt;的一个未公开函数的方法，你可以在当前线程里调用&lt;/span&gt;NtSetInformationThread&lt;span style="font-family: SimSun;"&gt;，调用这个函数时，如果在第二个参数里指定&lt;/span&gt;0x11&lt;span style="font-family: SimSun;"&gt;这个值（意思是&lt;/span&gt;ThreadHideFromDebugger&lt;span style="font-family: SimSun;"&gt;），等于告诉操作系统，将所有附加的调试器统统取消掉。示例代码&lt;/span&gt;: &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;// &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;声明一个函数指针。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: blue;"&gt;typedef&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt; NTSTATUS (*NtSetInformationThreadPtr)(HANDLE threadHandle,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;THREADINFOCLASS threadInformationClass,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PVOID threadInformation,&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG threadInformationLength);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: blue;"&gt;void&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt; NtSetInformationThreadApproach()&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;HMODULE hModule = LoadLibrary(TEXT(&lt;span style="color: #a31515;"&gt;"ntdll.dll"&lt;/span&gt;));&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;NtSetInformationThreadPtr NtSetInformationThread = (NtSetInformationThreadPtr)GetProcAddress(hModule, &lt;span style="color: #a31515;"&gt;"NtSetInformationThread"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;NtSetInformationThread(GetCurrentThread(), (THREADINFOCLASS)0x11, 0, 0);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;七、触发异常的方法&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;这个技术的原理是，首先，进程使用&lt;/span&gt;SetUnhandledExceptionFilter&lt;span style="font-family: SimSun;"&gt;函数注册一个未处理异常处理函数&lt;/span&gt;A&lt;span style="font-family: SimSun;"&gt;，如果进程没有被调试的话，那么触发一个未处理异常，会导致操作系统将控制权交给先前注册的函数&lt;/span&gt;A&lt;span style="font-family: SimSun;"&gt;；而如果进程被调试的话，那么这个未处理异常会被调试器捕捉，这样我们的函数&lt;/span&gt;A&lt;span style="font-family: SimSun;"&gt;就没有机会运行了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;这里有一个技巧，就是触发未处理异常的时候，如果跳转回原来代码继续执行，而不是让操作系统关闭进程。方案是在函数&lt;/span&gt;A&lt;span style="font-family: SimSun;"&gt;里修改&lt;/span&gt;eip&lt;span style="font-family: SimSun;"&gt;的值，因为在函数&lt;/span&gt;A&lt;span style="font-family: SimSun;"&gt;的参数&lt;/span&gt;_EXCEPTION_POINTERS&lt;span style="font-family: SimSun;"&gt;里，会保存当时触发异常的指令地址，所以在函数&lt;/span&gt;A&lt;span style="font-family: SimSun;"&gt;里根据这个指令地址修改寄存器&lt;/span&gt;eip&lt;span style="font-family: SimSun;"&gt;的值就可以了，示例代码如下：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;// &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;进程要注册的未处理异常处理程序&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;A&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;LONG WINAPI MyUnhandledExceptionFilter(&lt;span style="color: blue;"&gt;struct&lt;/span&gt; _EXCEPTION_POINTERS *pei)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;pei-&amp;gt;ContextRecord-&amp;gt;Eax); &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;// &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;修改寄存器&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;eip&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;的值&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;pei-&amp;gt;ContextRecord-&amp;gt;Eip += 2;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;// &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;告诉操作系统，继续执行进程剩余的指令（指令保存在&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;eip&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;里），而不是关闭进程&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; EXCEPTION_CONTINUE_EXECUTION;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: blue;"&gt;bool&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt; UnhandledExceptionFilterApproach()&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;__asm&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;将&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;eax&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;清零&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;xor eax, eax&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;触发一个除零异常&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;div eax&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;br /&gt; &lt;span style="font-family: SimSun;"&gt;八、调用&lt;/span&gt;DeleteFiber&lt;span style="font-family: SimSun;"&gt;函数&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;如果给&lt;/span&gt;DeleteFiber&lt;span style="font-family: SimSun;"&gt;函数传递一个无效的参数的话，&lt;/span&gt;DeleteFiber&lt;span style="font-family: SimSun;"&gt;函数除了会抛出一个异常以外，还是将进程的&lt;/span&gt;LastError&lt;span style="font-family: SimSun;"&gt;值设置为具体出错原因的代号。然而，如果进程正在被调试的话，这个&lt;/span&gt;LastError&lt;span style="font-family: SimSun;"&gt;值会被修改，因此如果调试器绕过了第七步里讲的反调试技术的话，我们还可以通过验证&lt;/span&gt;LastError&lt;span style="font-family: SimSun;"&gt;值是不是被修改过来检测调试器的存在，示例代码：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: blue;"&gt;bool&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt; DeleteFiberApproach()&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;char&lt;/span&gt; fib[1024] = {0};&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;会抛出一个异常并被调试器捕获&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;DeleteFiber(fib);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// 0x57&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: SimSun; color: green;"&gt;的意思是&lt;/span&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas; color: green;"&gt;ERROR_INVALID_PARAMETER&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; (GetLastError() != 0x57);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 9.5pt; font-family: Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: SimSun;"&gt;未完待续&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2064171.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/05/31/2064171.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/05/31/2063891.html</id><title type="text">反调试技术</title><summary type="text">在调试一些病毒程序的时候，可能会碰到一些反调试技术，也就是说，被调试的程序可以检测到自己是否被调试器附加了，如果探知自己正在被调试，肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术，首先我们来看看反调试技术。一、Windows API方法Win32提供了两个API, IsDebuggerPresent和CheckRemoteDebuggerPresent可以用来检测当前进程是否正在被调试，以IsDebuggerPresent函数为例，例子如下：BOOL ret = IsDebuggerPresent();printf("ret = %d\n", ret)</summary><published>2011-05-30T17:02:00Z</published><updated>2011-05-30T17:02:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/05/31/2063891.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/05/31/2063891.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;在调试一些病毒程序的时候，可能会碰到一些反调试技术，也就是说，被调试的程序可以检测到自己是否被调试器附加了，如果探知自己正在被调试，肯定是有人试图反汇编啦之类的方法破解自己。为了了解如何破解反调试技术，首先我们来看看反调试技术。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;一、Windows API方法&lt;/div&gt;&lt;div&gt;Win32提供了两个API, IsDebuggerPresent和CheckRemoteDebuggerPresent可以用来检测当前进程是否正在被调试，以IsDebuggerPresent函数为例，例子如下：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;BOOL ret = IsDebuggerPresent();&lt;/div&gt;&lt;div&gt;printf("ret = %d\n", ret);&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;破解方法很简单，就是在系统里将这两个函数hook掉，让这两个函数一直返回false就可以了，网上有很多做hook API工作的工具，也有很多工具源代码是开放的，所以这里就不细谈了。&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;二、查询进程PEB的BeingDebugged标志位&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;当进程被调试器所附加的时候，操作系统会自动设置这个标志位，因此在程序里定期查询这个标志位就可以了，例子如下：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;bool PebIsDebuggedApproach()&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char result = 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__asm&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 进程的PEB地址放在fs这个寄存器位置上&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax, fs:[30h]&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// 查询BeingDebugged标志位&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov al, BYTE PTR [eax + 2]&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov result, al&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result != 0;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;三、查询进程PEB的NtGlobal标志位&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;跟第二个方法一样，当进程被调试的时候，操作系统除了修改BeingDebugged这个标志位以外，还会修改其他几个地方，其中NtDll中一些控制堆（Heap）操作的函数的标志位就会被修改，因此也可以查询这个标志位，例子如下：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;bool PebNtGlobalFlagsApproach()&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int result = 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__asm&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 进程的PEB&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax, fs:[30h]&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// 控制堆操作函数的工作方式的标志位&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax, [eax + 68h]&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// 操作系统会加上这些标志位FLG_HEAP_ENABLE_TAIL_CHECK,&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// FLG_HEAP_ENABLE_FREE_CHECK and FLG_HEAP_VALIDATE_PARAMETERS，&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// 它们的并集就是x70&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;//&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// 下面的代码相当于C/C++的&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// &amp;nbsp; &amp;nbsp; eax = eax &amp;amp; 0x70&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and eax, 0x70&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov result, eax&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result != 0;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;四、查询进程堆的一些标志位&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;这个方法是第三个方法的变种，只要进程被调试，进程在堆上分配的内存，在分配的堆的头信息里，ForceFlags这个标志位会被修改，因此可以通过判断这个标志位的方式来反调试。因为进程可以有很多的堆，因此只要检查任意一个堆的头信息就可以了，所以这个方法貌似很强大，例子如下：&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;bool HeapFlagsApproach()&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int result = 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__asm&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 进程的PEB&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax, fs:[30h]&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 进程的堆，我们随便访问了一个堆，下面是默认的堆&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax, [eax + 18h]&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;&lt;/span&gt; &amp;nbsp;// 检查ForceFlag标志位，在没有被调试的情况下应该是&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov eax, [eax + 10h]&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov result, eax&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result != 0;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;参考资料：&lt;a href="http://www.symantec.com/connect/articles/windows-anti-debug-reference"&gt;http://www.symantec.com/connect/articles/windows-anti-debug-reference&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;未完待续&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2063891.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/05/31/2063891.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/05/30/2063557.html</id><title type="text">使用allpairs自动设计组合测试用例</title><summary type="text">配对测试的基本理念是，虽然程序的某个组件，或者程序自己会接受很多的输入，但大部分情况下，程序的bug不是因为这些输入同时作用而产生的，而是由一到两个输入条件同时作用导致的。因此配对测试在生成测试组合的时候，主要关注将每个条件与其它条件至少配对一次，而不是试图生成全组合，这样就可以大大减少需要测试的组合数，尽而节省测试工作量，同时又能达到满意的测试覆盖率。</summary><published>2011-05-30T10:25:00Z</published><updated>2011-05-30T10:25:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/05/30/2063557.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/05/30/2063557.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;一般都说测试先做单元测试，然后做集成测试，然后做系统测试之类的，其实说白了，也可以理解成将最基本的测试步骤，或者说测试环境使用一定的方法组合以后再生成新的测试用例。因为人工组合，第一比较费神，第二是有时要么是设计了几个等价的测试用例，重复执行这些等价的测试用例，比较费时。这里有一个比较好的测试技术，叫做配对（&lt;/span&gt;pair-wise&lt;span style="font-family: SimSun;"&gt;）测试，它可以根据你设定的条件，自动生成在测试时间（即工作量）和测试覆盖率之间做出平衡的组合。&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;配对测试的基本理念是，虽然程序的某个组件，或者程序自己会接受很多的输入，但大部分情况下，程序的&lt;/span&gt;bug&lt;span style="font-family: SimSun;"&gt;不是因为这些输入同时作用而产生的，而是由一到两个输入条件同时作用导致的。因此配对测试在生成测试组合的时候，主要关注将每个条件与其它条件至少配对一次，而不是试图生成全组合，这样就可以大大减少需要测试的组合数，尽而节省测试工作量，同时又能达到满意的测试覆盖率。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: SimSun;"&gt;当然不能期望配对测试是万能的，即我们仅依赖于配对测试自动生成的测试用例就可以了&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: SimSun;"&gt;，使用配对测试的目的是为了减少测试人员浪费在执行太多的等价组合的时间，将宝贵的时间尽可能地放在设计符合用户使用场景的测试用例上。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: SimSun;"&gt;具体示例（手工步骤）&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;废话少说，先看一个具体的示例，假设我们有下面一个产品，界面如下：&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/productui.png" width="365" height="300" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;对于上面这个产品（假设文本框接受&lt;/span&gt;1&lt;span style="font-family: SimSun;"&gt;到&lt;/span&gt;100&lt;span style="font-family: SimSun;"&gt;之间的整数），可以将测试条件划分为下面这样子：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel8.png" width="671" height="195" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family: SimSun;"&gt;当然，文本框的条件我们还可以再细分一下，但是为了描述简单，我把条件设置的比较粗糙，如果按照全组合的用例设置方式，需要&lt;/span&gt; 6 (&lt;span style="font-family: SimSun;"&gt;下拉框控件可能的条件&lt;/span&gt;) * 2 (&lt;span style="font-family: SimSun;"&gt;复选框可能的条件&lt;/span&gt;) * 2 (&lt;span style="font-family: SimSun;"&gt;单选框可能的条件&lt;/span&gt;) * 6 (&lt;span style="font-family: SimSun;"&gt;文本框可能的条件&lt;/span&gt;) = 144&lt;span style="font-family: SimSun;"&gt;个组合。&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;我们来看使用配对方式设计组合的方式：&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;先将上面的条件输入到&lt;/span&gt;Excel&lt;span style="font-family: SimSun;"&gt;里，并在列头标明可能出现的条件的个数，并按条件的个数将各个输入参数排序，如下图所示：&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel1.png" width="619" height="163" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;先将第二个和第三个参数的各个条件组合一次，这里为了省事起见，我先去掉第一个参数，只介绍第二、三、四个参数的配对组合方法：&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel2.png" width="473" height="306" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;然后再将第二个参数和第四个参数的各个条件组合一次，如下图所示：&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel3.png" width="549" height="302" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;4. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;为了确保第四个参数跟第三个参数的各个条件都有一次组合，可以使用&lt;/span&gt;Excel&lt;span style="font-family: SimSun;"&gt;提供的过滤功能来判断，例如下图中，很明显，两个参数没有一个完全组合：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel4.png" width="547" height="279" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;5. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;解决方案很简单，只需要再添加两行，将两个参数中没有组合的条件各自组合一次好了（当然，你也可以将第四个参数的条件稍微调整一下达到相同的目的）：&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel5.png" width="550" height="347" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: SimSun;"&gt;自动化步骤&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;上面的工作还是有点繁琐，实际上早已有人将这个过程自动化了，这里介绍一个免费开源的工具&lt;/span&gt;allpairs.exe&lt;span style="font-family: SimSun;"&gt;，请于下面这个链接里下载：&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.satisfice.com/tools/pairs.zip"&gt;http://www.satisfice.com/tools/pairs.zip&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;对于上面的例子，使用&lt;/span&gt;allpairs&lt;span style="font-family: SimSun;"&gt;生成组合的方式是：&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;先将上面的条件输入到&lt;/span&gt;Excel&lt;span style="font-family: SimSun;"&gt;里，如下图所示（因为这个工具是老外写得，没有考虑支持中文的问题，所以最好全部用英文表示）：&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel6.png" width="694" height="171" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;将&lt;/span&gt;Excel&lt;span style="font-family: SimSun;"&gt;文件保存为以&lt;/span&gt;Tab&lt;span style="font-family: SimSun;"&gt;键作为分隔符的文本文件：&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel7.png" width="667" height="490" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;然后使用&lt;/span&gt;allpairs.exe&lt;span style="font-family: SimSun;"&gt;处理这个文件：&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family: "Courier New";'&gt;allpairs.exe test.txt &amp;gt; output.txt&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;4. &lt;/span&gt;&lt;span style="font-family: SimSun;"&gt;在&lt;/span&gt;output.txt&lt;span style="font-family: SimSun;"&gt;里，&lt;/span&gt;PAIRING DETAILS&lt;span style="font-family: SimSun;"&gt;下面的东西都是没有用的，可以直接删掉，删掉以后，结果如下：&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/killmyday/allpairsexcel9.png" width="555" height="825" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;你可以在设计测试环境矩阵还有组合测试用例的时候使用&lt;/span&gt;allpairs&lt;span style="font-family: SimSun;"&gt;这个技术，当然，你不能完全依赖这个技术，除了&lt;/span&gt;allpairs&lt;span style="font-family: SimSun;"&gt;组合的测试用例以外，你最好再根据测试覆盖率和用户场景覆盖率入手，补充更有价值的测试用例。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: SimSun;"&gt;另外，使用配对测试的算法，我们有可能结合&lt;/span&gt;Behavior Driven Design&lt;span style="font-family: SimSun;"&gt;技术，直接从需求自动生成测试用例，加之如果我们将基本的测试用例自动化以后，完全可以使用这个技术将自动化过的测试用例配对组合（当然需要加上一些限制条件），在节省测试时间的同时，达到满意的测试覆盖率，当然，这样做要求我们自己写一个测试工具来实现这个技术&amp;#8212;至少到现在我还没有看到现成的工具，而且这个技术应该要比模型驱动测试更容易使用，因为模型驱动测试的问题是建模太困难。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2063557.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/05/30/2063557.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/04/21/2023816.html</id><title type="text">使用gettext技术为ASP.NET网站实现国际化支持</title><summary type="text">简单介绍了在ASP.NET网站里添加国际化支持的另外一种方案。</summary><published>2011-04-21T09:31:00Z</published><updated>2011-04-21T09:31:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/04/21/2023816.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/04/21/2023816.html"/><content type="html"> &lt;p class="MsoNormal"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;不知道有多少人对这个题目感兴趣，因为最近在做一个网站玩玩，有点闲心给网站加了国际化支持。虽然&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;已经有&lt;/span&gt;&lt;font face="Calibri"&gt;ResourceManager&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;这个类，并且有标签实现国际化的支持了，但是它的问题是，&lt;/span&gt;&lt;font face="Calibri"&gt;ResourceManager&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;对每一个需要翻译的句子都要求有一个键（&lt;/span&gt;&lt;font face="Calibri"&gt;Key&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;）：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;1.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;要先创建一个&lt;/span&gt;&lt;font face="Calibri"&gt;.resx&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件，在&lt;/span&gt;&lt;font face="Calibri"&gt;VisualStudio&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;里，有一个工具编辑这个&lt;/span&gt;&lt;font face="Calibri"&gt;.resx&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;2.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;对每一个需要翻译的句子，添加一个键值对。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;3.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;然后在代码里，使用&lt;/span&gt;&lt;font face="Calibri"&gt;ResourceManager&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;或者&lt;/span&gt;&lt;font face="Calibri"&gt;&amp;lt;%#&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;这个标签，通过定义好的键来告诉&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;在运行的时候查找正确的翻译文本。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;太麻烦了，不知道大家有什么其它好的方法，我使用的方法是从&lt;/span&gt;&lt;font face="Calibri"&gt;unix gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;那边借用过来的理念。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong style="mso-bidi-font-weight: normal;"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;理念&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;font face="Calibri"&gt;Gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;的理念很简单，文本翻译吗，说白了就是把一句话翻译成另外一句话嘛，这个要翻译的句子，本身就可以当做检索要用的关键字，何必要再新建一个另外的关键字呢？&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;的方式很简单：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;1.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;在源代码里，你可以编写一个特殊的函数执行翻译，这个函数只接受一个参数，就是要翻译的文本。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;2.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;使用一个辅助程序&lt;/span&gt;&lt;font face="Calibri"&gt;xgettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;扫描源代码的文本，将所有待翻译的文本都找出来，保存到一个文件里，一般来说，这个文件叫做&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;3.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;因为&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;程序不支持&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件，再使用一个辅助程序&lt;/span&gt;&lt;font face="Calibri"&gt;msgfmt&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;将&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件转换成&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;支持的&lt;/span&gt;&lt;font face="Calibri"&gt;.resources&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;这个方法的优点在于：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;1.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;你在编写程序的时候，不用为需要翻译的句子，定义一个新的关键字&amp;#8212;&amp;#8212;这个关键字一般都比较难理解，也不好取名。在维护代码的时候很麻烦&amp;#8212;&amp;#8212;因为你需要不停地在&lt;/span&gt;&lt;font face="Calibri"&gt;.resx&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;编辑器和&lt;/span&gt;&lt;font face="Calibri"&gt;cs&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件之间切换。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;2.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;不知道怎么搞的，很难找到可以编辑&lt;/span&gt;&lt;font face="Calibri"&gt;.resx&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件的工具，而&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;生成的&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件是普通的文本文件，而且格式非常简单。这样在翻译的时候，就很方便了。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;strong style="mso-bidi-font-weight: normal;"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;做法&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;比如写了一个&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET MVC&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;程序，当然窗体（&lt;/span&gt;&lt;font face="Calibri"&gt;Web Form&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;）形式的程序理念也是一样的，&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;1.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;写一个控制器和视图页的基类，里面都有一个执行翻译的函数&lt;/span&gt;&lt;font face="Calibri"&gt;T&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;table style="border: currentColor; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt;&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes;"&gt;  &lt;td style="padding: 0in 5.4pt; border: 1pt solid windowtext; width: 6.65in; background-color: transparent; mso-border-alt: solid windowtext .5pt;" valign="top" width="638"&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;G18nController&lt;/span&gt;  : Controller&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;  &lt;span style="color: rgb(43, 145, 175);"&gt;CultureInfo&lt;/span&gt; Culture { &lt;span style="color: blue;"&gt;get&lt;/span&gt;; &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;  &lt;span style="color: blue;"&gt;string&lt;/span&gt; T(&lt;span style="color: blue;"&gt;string&lt;/span&gt;  message)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;  obj = HttpContext.GetGlobalResourceObject(&lt;span style="color: rgb(163, 21, 21);"&gt;"website"&lt;/span&gt;,  message, Culture);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;  translated = obj == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: blue;"&gt;null&lt;/span&gt; : obj.ToString();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;  (&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(translated))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;  message;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;  translated;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;abstract&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;G18nWebViewPage&lt;/span&gt;&amp;lt;U&amp;gt; : WebViewPage&amp;lt;U&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;CultureInfo&lt;/span&gt; Culture { &lt;span style="color: blue;"&gt;get&lt;/span&gt;;  &lt;span style="color: blue;"&gt;set&lt;/span&gt;; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;  &lt;span style="color: blue;"&gt;string&lt;/span&gt; T(&lt;span style="color: blue;"&gt;string&lt;/span&gt;  message)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;  obj = HttpContext.GetGlobalResourceObject(&lt;span style="color: rgb(163, 21, 21);"&gt;"website"&lt;/span&gt;,  message, Culture);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt;  translated = obj == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: blue;"&gt;null&lt;/span&gt; : obj.ToString();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt;  (&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(translated))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;  message;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt;  translated;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;上面的&lt;/span&gt;&lt;font face="Calibri"&gt;Culture&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;属性，可以从&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;Request.Headers[&lt;span style="color: rgb(163, 21, 21);"&gt;"Accept-Language"&lt;/span&gt;]&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;属性取得。&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;2.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;在代码里，针对每个要翻译的句子，直接调用这个&lt;/span&gt;&lt;font face="Calibri"&gt;T&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;函数好了：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="color: blue; font-family: Consolas; font-size: 9.5pt;"&gt;throw&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(T(&lt;span style="color: rgb(163, 21, 21);"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21); font-family: SimSun; font-size: 9.5pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas;" lang="ZH-CN"&gt;找不到&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21); font-family: Consolas; font-size: 9.5pt;"&gt;ID&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21); font-family: SimSun; font-size: 9.5pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas;" lang="ZH-CN"&gt;为&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21); font-family: Consolas; font-size: 9.5pt;"&gt;{0}&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21); font-family: SimSun; font-size: 9.5pt; mso-ascii-font-family: Consolas; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Consolas; mso-bidi-font-family: Consolas;" lang="ZH-CN"&gt;的项目&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21); font-family: Consolas; font-size: 9.5pt;"&gt;!"&lt;/span&gt;&lt;span style="font-family: Consolas; font-size: 9.5pt;"&gt;), id));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;3.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;程序写好后，要开始翻译，调用&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;程序将所有要翻译的句子找出来，保存到指定的&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件里。可以在&lt;/span&gt;&lt;a href="http://gnuwin32.sourceforge.net/packages/gettext.htm"&gt;&lt;font color="#0000ff" face="Calibri"&gt;http://gnuwin32.sourceforge.net/packages/gettext.htm&lt;/font&gt;&lt;/a&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;这个网页下载&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;但是悲剧的是，&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;好像要求主语言是英文，对中文字符串支持的不是很好。所以我就用&lt;/span&gt;&lt;font face="Calibri"&gt;C#&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;自己写了一个&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;，你可以在本文的附件里下载它，命令的格式是：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;Zgettext-k T -i &lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;源代码路径名&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt; -o &lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;输出的&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;po&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;文件名&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;Zgettext-k T -f &lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;源代码路径列表文件&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt; -o &lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;输出的&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;po&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;文件名&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;比如：&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;Zgettext-k T -i AccountController.cs -o test.po&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;4.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;生成的&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件格式其实非常简单易懂：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;table style="margin: auto auto auto 0.25in; border: currentColor; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt;&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes;"&gt;  &lt;td style="padding: 0in 5.4pt; border: 1pt solid windowtext; width: 6.65in; background-color: transparent; mso-border-alt: solid windowtext .5pt;" valign="top" width="638"&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;1.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;#: C:\workspace\Views\Role\Edit.cshtml:9&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;2.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;msgid "&lt;/span&gt;&lt;span style='font-family: NSimSun; font-size: 9.5pt; mso-ascii-font-family: "Courier New"; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;管理用户组&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;3.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;msgstr ""&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;4.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;5.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;#: C:\workspace\Views\Role\Edit.cshtml:23&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;6.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;msgid "&lt;/span&gt;&lt;span style='font-family: NSimSun; font-size: 9.5pt; mso-ascii-font-family: "Courier New"; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;用户组&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;[{0}]&lt;/span&gt;&lt;span style='font-family: NSimSun; font-size: 9.5pt; mso-ascii-font-family: "Courier New"; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;的权限&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: NSimSun;"&gt;&lt;span style="mso-list: Ignore;"&gt;7.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New"; font-size: 9.5pt; mso-fareast-font-family: NSimSun;'&gt;msgstr ""&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: NSimSun;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;font face="Calibri"&gt;&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Msgid&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;就是要翻译的句子，&lt;/span&gt;&lt;font face="Calibri"&gt;msgstr&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;就是翻译好的句子。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;5.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;完成翻译后，使用一个辅助程序&lt;/span&gt;&lt;font face="Calibri"&gt;msgfmt&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;将翻译好的&lt;/span&gt;&lt;font face="Calibri"&gt;po&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件转换成&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;支持的格式。因为原始的&lt;/span&gt;&lt;font face="Calibri"&gt;gettext&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;程序包里的&lt;/span&gt;&lt;font face="Calibri"&gt;msgfmt.exe&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;好像不能生成&lt;/span&gt;&lt;font face="Calibri"&gt;ASP.NET&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;识别的&lt;/span&gt;&lt;font face="Calibri"&gt;.resources&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;文件，所以&lt;/span&gt;&lt;span lang="ZH-CN"&gt;&lt;font face="Calibri"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;我也写了一个&lt;/span&gt;&lt;font face="Calibri"&gt;msgfmt&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;程序完成这个工作&amp;#8212;&amp;#8212;在本文的附件里可以下载到，命令格式是：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;Msgfmt-o &lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;输出的&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;resource&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;文件路径&lt;/span&gt;&lt;span style='font-family: "Courier New";' lang="ZH-CN"&gt; &lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;-i&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;输入的&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;po&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;文件路径&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;例如：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;Msgfmt-o website.en-US.resources -i website.po&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;注意：输出的&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;resource&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;文件名，必须与你在第一步里，使用&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;HttpContext.GetGlobalResourceObject&lt;/span&gt;&lt;span style='font-family: SimSun; mso-ascii-font-family: "Courier New"; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "Courier New"; mso-bidi-font-family: "Courier New";' lang="ZH-CN"&gt;函数的第一个参数相同。&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New";'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;&lt;font face="Calibri"&gt;6.&lt;/font&gt;&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;我写了一个小的批处理，将&lt;/span&gt;&lt;font face="Calibri"&gt;3&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;、&lt;/span&gt;&lt;font face="Calibri"&gt;4&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;、&lt;/span&gt;&lt;font face="Calibri"&gt;5&lt;/font&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;步结合在一起执行：&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;table style="margin: auto auto auto 0.5in; border: currentColor; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0in 5.4pt 0in 5.4pt;" class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt;&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes;"&gt;  &lt;td style="padding: 0in 5.4pt; border: 1pt solid windowtext; width: 6.65in; background-color: transparent; mso-border-alt: solid windowtext .5pt;" valign="top" width="638"&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;1.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;pushd src&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;2.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;del /F source.lst&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;3.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;dir /s /b src\*.cs &amp;gt;&amp;gt; source.lst&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;4.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;dir /s /b src\*.cshtml &amp;gt;&amp;gt; source.lst&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;5.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;tools\zgettext\zgettext\bin\Debug\zgettext.exe  -k T -f source.lst -o glob\website.po&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style='font-family: "Courier New"; mso-fareast-font-family: "Courier New";'&gt;&lt;span style="mso-list: Ignore;"&gt;6.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;tools\zgettext\msgfmt\bin\Debug\msgfmt.exe  -o src\App_GlobalResources\website.resources -i glob\ website.po&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin;"&gt;&lt;span style="mso-list: Ignore;"&gt;7.&lt;span style='font: 7pt/normal "Times New Roman"; font-size-adjust: none; font-stretch: normal;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style='font-family: "Courier New";'&gt;popd&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="MsoListParagraph"&gt;&lt;o:p&gt;&lt;font face="Calibri"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family: SimSun; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;希望对你有点帮助。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;a&gt;&lt;/a&gt;&lt;span style='line-height: 115%; font-family: "Calibri","sans-serif"; font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;'&gt;&lt;br style="mso-special-character: line-break;" /&gt;&lt;br style="mso-special-character: line-break;" /&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2023816.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/04/21/2023816.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/killmyday/archive/2011/04/14/2015632.html</id><title type="text">BDD测试演示视频</title><summary type="text">我录得一个视频，不过遗憾的是网上没有那么大的空间，看不到演示里的代码了。 http://v.youku.com/v_show/id_XMjU4NTIxNTI4.html</summary><published>2011-04-14T01:33:00Z</published><updated>2011-04-14T01:33:00Z</updated><author><name>donjuan</name><uri>http://www.cnblogs.com/killmyday/</uri></author><link rel="alternate" href="http://www.cnblogs.com/killmyday/archive/2011/04/14/2015632.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/killmyday/archive/2011/04/14/2015632.html"/><content type="html">&lt;p&gt;我录得一个视频，不过遗憾的是网上没有那么大的空间，看不到演示里的代码了。&lt;/p&gt;&lt;p&gt;&lt;div&gt;  &lt;p&gt;&lt;span style="color: #1f497d;"&gt;&lt;a href="http://v.youku.com/v_show/id_XMjU4NTIxNTI4.html"&gt;http://v.youku.com/v_show/id_XMjU4NTIxNTI4.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/killmyday/aggbug/2015632.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/killmyday/archive/2011/04/14/2015632.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
