当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: le="FONT-SIZE: 8pt; C
 

 

    摘要: 用过虚拟函数的程序员,肯定对switch/case 句型带有一种不想用的心理,因为如果case过多的话,至少会有以下缺点: 1) 代码太长,不适合查看和管理; 2) switch/case不够灵活; 3) 扩充性不够好,比如每增加一个case都要更改代码。 mfc有一个很好的框架,继承自cobject且通过declare_dynamic()和implement_dynamic声明......
    摘要: 各位兄弟在看到标题时,可能会火冒三丈,"你这小子,欠揍吗?"在messagebox的最后参数上指定mb_yesno不就行了?众兄弟请息怒,请再看一遍标题,我说的是显示"yes"与"no",不是"是"与"否" #include <windows.h> hhook hhook;lresult __stdcall cbthookproc( long ncode,wparam wpara......


翻译Matt Pietrek 的 Under the Hood 专栏文章 The .NET Profiling API and the DNProfiler Tool

http://msdn.microsoft.com/msdnmag/issues/01/12/hood/default.aspx 【程序编程相关:一些容易遗忘的小技巧

the .net profiling api and the dnprofiler tool 【推荐阅读:CDC使用技巧之最快最方便的实现放大缩小

随着系统的发展变得越来越复杂,能够理解系统的内部工作机制变得越来越有价值.在windows®,调查可执行程序装载器.内存管理器的操作机制将展示很多不同的技巧.另外,有些技巧在window 9x 平台下能够正常工作,但是在windows nt® 与windows 2000不能工作,反之亦然.在win32®下,查看进程的内部操作的最好方式是使用调试api,但是它也只能是包含很少的一部分. 【扩展信息:ATL Style 模板学习手记

微软的.net common language runtime(clr)内部提供了很多机制来创建更容易使用.更面向对象的平台.包括垃圾回收.标准的跨语言异常处理.广泛的类库.元数据.与已存native代码的互操作性.远程处理.也包括跨cpu指令格式(中间语言,il)与将il编译成能够在目标cpu上运行的代码的即时编译器.

在.net下就完全不同了.因为clr运行时是任何.net程序的中心,它提供了一个逻辑位置来插入钩子以便观察.net的内部.预计到工具开发者.系统级程序员的需要,microsoft使用.net来提供了一个非常详细的.一致的方式去观察进程的内部操作.本月,我要描述这种机制.并提供一个程序(dnprofile)来记录.net运行时的操作.

the .net profiling api

              观察.net运行时动作的一种方式时使用剖析api.剖析api的命名不好,因为它对很多种事情都很有用,而不仅仅是剖析.考虑可以被剖析api观察的.net动作列表,如下:

        figure 1 functions of the profiling api

clr startup and shutdown

application domain creation/shutdown

assembly loads/unloads

module loads/unloads

class loads/unloads

com interop vtable creation/destruction

jit-compiles, code pitching, and pre-jited method searches

thread creation/destruction/suspends

remoting activity

exception handling

managed/unmanaged code transitions

garbage collection and managed heap objects

method entry/exit

       正如keanu reeves会说whoooa! 相对于经过了多年的艰苦探索找到的如何给windows安装钩子来讲,microsoft使观察clr的行为变得非常容易了.列表中的每一个动作可以看作一个完全不同的callback.理论上讲,仅仅在callback函数中写需要的代码就可以了.

        现在,最好的剖析api文档是.net sdk下的profiling.doc,在tool developers guide\docs目录下.对于beta2 来讲,这个文档与实现稍微有些不同步.在本期刊中,我不会广泛的讨论剖析api的每一个方面,而是重点讨论剖析api能做的大的方面.

.net的一个大的卖点是它不再使用com.这不是真的,事实上,剖析api就是基于com的.使用剖析api包括创建一个进程内服务器,它实现了单一的接口.每一个接口方法代表了figure 1中的一个事件.在callback方法内部,代码可以使用另外的com接口(由clr提供)来得到观察事件的信息.

个人来讲,我喜欢更简单的api来对所感兴趣的每一个事件进行注册.将api实现作为一个com对象强迫你写几乎同样的代码以便使用com对象.既然剖析api是基于com的,剖析api的用户很可能使用c++.

尽管使用典型的com而不是使用托管.net代码起初看起来有些奇怪,仔细考虑之后就会明白.如果用托管代码实现接口,它将对监视的所有事件的产生负面影响.例如,如果实现接口的托管代码触发了异常怎么办?在api没有激活的情况下,异常事件也不会发生.

一旦你有一个实现了profiling接口的com服务器,下一步是强迫clr装载com服务器.调用它的方法.技巧是设置环境变量.跟注册表.xml文件比较起来,环境变量是挺古老的.

为什么不用注册表(配置文件)告诉clr应该调用profiling api?我从microsoft开发者那里听说的一个原因是那要求.net程序在启动时检查注册表将会有性能影响.考虑到.net启动时有很多事情要做,这样的原因考虑的也是很慎重的.虽然如此,使用环境变量可以对所有程序起作用(如果在系统环境变量)或单独的进程.在后者情况下,调试器.剖析器等工具可以在启动程序时指定环境变量.稍后我将讨论所需要的环境变量.

the .net profiling api interfaces


...   下一页
 ·在dialog程序中使用wh    »显示摘要«
    摘要: 在dialog程序中使用wh_keyboard_ll类型hook的方法: setwindowshookex(wh_keyboard_ll, (hookproc)lowlevelkeyboardproc, afxgetapp()->m_hinstance, null); lresult callback lowlevelkeyboardproc (int ncode, wparam wp......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE