虫虫技术在线--技术决定出路

当前位置: 首页 > 编程 > .net >

微软MVP手把手教你如何修改.NET Framework(2)

时间:2010-04-07 23:38来源:虫虫技术在线收集整理 作者:虫虫编辑 点击:
#e# 4,利用reflector查看所要寻找的类或方法的定义 打开reflector,查找所要寻找的类或方法,并查看其定义,假设我们需要的是Guid.NewGuid()方法: 切换到IL视
#e#

4,利用reflector查看所要寻找的类或方法的定义

打开reflector,查找所要寻找的类或方法,并查看其定义,假设我们需要的是Guid.NewGuid()方法:
 

打开reflector
 

切换到IL视图: 

切换到IL视图""


OK,有了该IL片段,要在mscorlib.dll.il的汪洋大海中查找该方法就很简单了(Ctrl-F)
 

5,修改IL代码

在notepad++或UltraEdit中找到对应的方法。我们发现NewGuid()实际是调用其Guid(bool)方法,我们可以将其替换成默认构造函数(默认构造函数构造的guid为00000000-0000-0000-000000000000)这样一来调用NewGuid()方法时则始终返回0值了,也可以在调用Guid(bool)时传入true,我们采用后者:

  .method public hidebysig static valuetype System.Guid 
NewGuid() cil managed
{
// 代码大小       7 (0x7)
    .maxstack  8
IL_0000:  ldc.i4.0
IL_0001:  newobj     instance void System.Guid::.ctor(bool)
IL_0006:  ret
// end of method Guid::NewGuid

上面代码中的IL_0000:  ldc.i4.0 表示将0(false)作为4字节整数入栈,我们将其中的0改成1:

  .method public hidebysig static valuetype System.Guid 
NewGuid() cil managed
{
// 代码大小       7 (0x7)
    .maxstack  8
IL_0000:  ldc.i4.1
IL_0001:  newobj     instance void System.Guid::.ctor(bool)
IL_0006:  ret
// end of method Guid::NewGuid

 

(注意,这里的操作很简单,所以很单纯地修改了,若对于比较复杂的操作请先学习IL相关知识)
然后保存你的修改。

6,编译IL代码,生成新的DLL

利用ms提供的ilasm可以将IL文件编译成dll:
 

生成新的DLL


(编译前别忘记关闭文本编辑器,比如ultraEdit会独占文件而导致无法访问)

7,将修改后的DLL放回到GAC 

你可能会想到按照MSDN上提到的方法就如同安装自己普通的程序集一样将其安装到GAC,大概能猜想到这是不可行的,否则”不安全了“。 或者,我们刚才不是记录了mscorlib的路径的吗,直接复制粘贴进去覆盖不就行了,也许可以,也许不可以,只所以说不可以,原因有可能有二,一是根本不让访问页不让覆盖,二是程序.net程序运行时会检查程序集版本。那么就试试看吧:
直接访问指定的路径看来是不行的了,正如下图所示:
 

检查路径


不过没关系,我们可以通过第三方工具访问到该目录,可以通过刚才的FileMon,双击条目可以打开相应的文件目录,还有一种更常用的方便的方式是用TotalCommander,其可以方便的访问Windows的各种隐藏路径。
 

访问<a class="channel_keylink" href="http://windows.chinaitlab.com/" target="_blank">Windows</a>的各种隐藏路径""


 

将文件拖放到对应目录便可以覆盖了.
 

8, 删除程序集的本机映像(native image)

回到刚才用FileMon监视mscorlib访问时,大家可能会发现我们的小程序直接访问的并非mscorlib.dll, 而是一个名为mscorlib.ni.dll的文件(在C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\9adb89fa22fd5b4ce433b5aca7fb1b07\ 路径下),这是mscorlib.dll的本机映像(native image), 关心过.net优化的朋友应该会知道我们可以通过ngen来将程序集生成本机映像以提高运行速度. 那么程序将直接去访问该映像而非我们修改过的mscorlib.dll,这会导致我们的修改看不到效果。所以我们要将该映像删除。为什么是删除,而不是将修改过的mscorlib.dll利用ngen来生成一个新的映像而覆盖之? 原因很简单,大家自己想想吧。
首先,利用ngen uninstall 命令从本机映像缓存中卸载本地映像,然后利用TotalCommander将其删除(注意,先关闭可以对所覆盖的程序集有所引用的应用程序,最好重启一下电脑,应该不用进安全模式删那么费劲)
 

9,验证一下修改.NET Framework成果

    class Program
{
static void Main(string[] args)
{
Guid guid1 = Guid.NewGuid();
Guid guid2 = Guid.NewGuid();
Console.WriteLine("the first  GUID: {0}", guid1);
Console.WriteLine("the second GUID: {0}", guid2);
Console.Read();
}
    }
如果使用MS原版的mscorlib.dll我们将得到类似于下面的输出: 

使用MS原版

使用我们修改过的mscorlib.dll:
 

修改过的mscorlib.dll

(另外,值得注意的是,Visual studio对某些程序集的引用来自于C:\Program Files\Reference Assemblies 下,所以,对于某些程序集如果要对VS引用造成影响则应该覆盖C:\Program Files\Reference Assemblies下的对应文件。这里的mscorlib不需要)

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容