让NhibernateProfiler更完美一点-为NhibernateProfiler增加“附加到进程”功能
上一篇我们写了Nhibernate Profiler 2.0 的破解,做的是破坏性的工作,这篇我们来点建设性的东西--为Nhibernate Profiler 增加一个附加到进程的功能……
注:本来 是讲要写一个自动破解工具 的 ……
没用过Nhibernate Profiler的人可能不明白我究竟在说些什么
所以,我们先来简单说一说Nhibernate Profiler是怎么使用的。
要想使用Nhibernate Profiler的功能,首先要在你的工程里添加一个对HibernatingRhinos.Profiler.Appender.dll的引用,这个文件就在Nhibernate Profiler 根目录下,添加引用后,还要找个合适的地方(启动的时候,Nhibernate初始化前后等)加这么一句
HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
这是相当让人蛋疼的事情,我一般称这种为强奸式调试工具,也就是说不管你愿不愿意,他都要强行插入,这点实在让人无法忍受,无论怎么看,那段强行插入的代码都是那么刺眼,就象锅里的老鼠屎,把一段好好的代码硬生生的给毁了,那么怎么样才能既不被强奸又能使用它的功能呢,方法当然是有的,这正是我们下面要来描述的。
一样的,为了更好的描述实现思路,我们先来看看实现后的样子
不过在这之前,我们还要做一些准备,至少得准备一个使用了Nhibernate技术的程序作为测试的目标,这个在附录的根目录下有一个叫测试的文件夹,那里面有一个解决方案,这是我参考Nhibernate官网的Get Start 写的一个Winform例子 (目前我们这个只支持附加到32位的Winform程序,要想附加到WEB的话,可能要重新实现很多东西,暂时懒得研究了,有时间的话可能会去再搞搞,要想实现附加到64位的Winform,需要设置一些参数,重新编译,这个 在讲解的时候会 提到)。 看源码可以知道,我们这个并没有引入HibernatingRhinos.Profiler.Appender.dll,也没有在代码加那句话 ,要的就是这样的纯洁性,纯的让你鸡动。 当然如果你不想看代码的话,在这个目录下还有一个build文件夹,里面有一个Winform.exe 是编译后的文件,可以直接运行,当然运行前, 要先建数据库表,建表语句在build文件下有一个Tables.sql ,我使用的是SQL SERVER数据库,建好后,再配置一下hibernate.cfg.xml里的数据库连接选项。 这些做完后,运行或者直接打开 Winform.exe 。
先不要点 按钮
回到附录的根目录下的NHProf文件夹,找到NHProfLancher.exe文件(注:不是NHProf.exe),双击打开。 本来是准备实现成点击 Help菜单的第一个选项(原来是Commercial Support ,现在我已经改成 Attach To Process了)就可以打开附加选项的,但令人蛋疼的silverlight权限问题(用spy++看一下就知道了,silverlight的桌面应用其实也就是在一个WEBBROWSER控件里执行xap ,所以他不是一个完整意义的桌面程序),这就使得他的权限其实和WEB的权限是一样的,所以Process.Start打开网址可以,但当想打开一个本地文件时却完全没啥反应了,另外对silverlight也不是很熟,所以也就懒得去深入研究了,在这里只是简单的改了个容易识别的网址 , 留着以后有时间再研究 吧 )
双击 NHProfLancher.exe后,我们发现程序已经打开了。
这时候回到刚才的测试程序Winform.exe 。然后点击 按钮
插入成功,看看数据库也成功了,再看看Nhibernate Profiler的主界面。
没啥反应 ,这是当然的,这是不被强奸的下场 。
OKAY ,这时候 CTRL + ALT + 1 (1,2,3那个1,这么蛋疼的热键,我想不会和别的冲突了吧)。
调出了附加进程。
(名字Form1 你先看着吧)
可以看到列出了所有的32位的DotNet程序的进程。其中也包括了我们的那个测试程序 Winform.vshost(调试模式下的进程名) 选中她
点击,会弹出如下的提示框
点击确定 。
这时候看一看NHibernate Profier 的主界面
看到上面的那个Winform了吗,说明已经附加上去了,当然还是要确实一下,回到测试程序。再点击 添加数据 。 这时候再看一下 Nhibernate Profiler 主界面
已经监控到刚才 那个操作了。 OKAY…… :) 依然的又鸡动一次
这篇先写到这里,下篇来分析下实现原理。