自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

微軟MVP手把手教你如何修改.NET Framework

開發(fā) 后端
本文作者在工作中碰到了為跟蹤一個(gè)Bug而焦頭爛額的問題,最后發(fā)現(xiàn)是.NET Framework的原因。所以作者寫下此文與大家探討。

這段時(shí)間為跟蹤一個(gè)Bug而焦頭爛額,最后發(fā)現(xiàn)是.NET Framework的問題,這讓人多少有些絕望。所以到微軟論壇提了個(gè)帖子,希望能得到些幫助。雖然論壇智能到能夠判斷樓主是否是MSDN訂閱用戶,以便盡快解決(傳說MSDN訂閱用戶的問題能在兩天內(nèi)得到回復(fù)的,當(dāng)時(shí)還很得意公司為我們購(gòu)買的MSDN訂閱賬號(hào)),但得到的回復(fù)是“Could you file a bug report for this issue through Connect?”,絕望之后的又一次寒心啊。

看過payeasy的廣告之后,便有了以下的這些內(nèi)容,如何修改.NET Framework: 

這里我們以修改Guid類為例,我們將修改這個(gè)類的內(nèi)部構(gòu)造,以便其始終構(gòu)造值為0值(00000000-0000-0000-000000000000)的對(duì)象

1,知道你要修改.NET Framework中的誰(dll的名稱)

這很簡(jiǎn)單, 翻翻MSDN,你應(yīng)該能找到你所調(diào)用的類庫(kù)是哪一個(gè),或者使用reflector可以得到更詳盡的信息。從MSDN得知,Guid類在mscorlib.dll中

2,找到你要修改的dll,并拷貝出來,以便修改

mscorlib.dll位于GAC中,很可惜,windows只允許按照“可遠(yuǎn)觀不可褻玩"的方式靜靜欣賞(盡管心急如焚)


我們現(xiàn)在需要將該dll在操作系統(tǒng)中的實(shí)際路徑找出來

2.1 下載FileMon,其用于監(jiān)視文件的被訪問情況,我們可以通過他,找到文件路徑

2.2  寫一個(gè)小程序,讓該程序去訪問(引用)你需要查找路徑的文件,這里也就是我們的mscorlib

        static void Main(string[] args)
        {
            Guid guid = Guid.NewGuid();

            Console.WriteLine(guid);

            Console.Read();
        }

代碼中的Guid以及Console等都會(huì)訪問mscorlib.dll

2.3 運(yùn)行FileMon,讓他去監(jiān)視mscorlib的訪問,由于我們不知道m(xù)scorlib的具體路徑(廢話),但我們至少知道它在C:\WINDOWS\assembly下(至少知道在系統(tǒng)盤下),那么我們就將這個(gè)文件夾及其所有文件一塊監(jiān)視吧: 

監(jiān)視文件


2.4,運(yùn)行我們的小程序,F(xiàn)ileMon將監(jiān)視到所有到C:\WINDOWS\assembly下的訪問,并將包含mscorlib的高亮,雙擊列表中的條目,其將自動(dòng)打開文件所在的文件夾:

打開文件所在的文件夾


OK,現(xiàn)在找到該dll文件了,將其拷貝出來,以供我們修改,并將其路徑記錄下來以備將來使用(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089)。另外,建議備份一下拷出來的dll。

3,利用ildasm反編譯該dll,生成中間語(yǔ)言(IL)文件,我們將修改該IL文件

ildasm是.NET自帶的一個(gè)反編譯工具,可以再SDK中找到,但通過VS的控制臺(tái)便可以使用了(具體使用方式,參考MSDN)

VS控制臺(tái)


然后可以得到該程序集的IL文件

得到IL文件


它其實(shí)是一個(gè)文本文件,所以可以直接打開進(jìn)行編輯,但建議使用Notepad++或 UltraEdit 文本編輯器,但打開后似乎有些讓人有些崩潰,汪洋大海啊,如何找到我們需要修改的代碼所在的位置呢

#p#

4,利用reflector查看所要尋找的類或方法的定義

打開reflector,查找所要尋找的類或方法,并查看其定義,假設(shè)我們需要的是Guid.NewGuid()方法:

打開reflector

切換到IL視圖: 

切換到IL視圖""


OK,有了該IL片段,要在mscorlib.dll.il的汪洋大海中查找該方法就很簡(jiǎn)單了(Ctrl-F)

5,修改IL代碼

在notepad++或UltraEdit中找到對(duì)應(yīng)的方法。我們發(fā)現(xiàn)NewGuid()實(shí)際是調(diào)用其Guid(bool)方法,我們可以將其替換成默認(rèn)構(gòu)造函數(shù)(默認(rèn)構(gòu)造函數(shù)構(gòu)造的guid為00000000-0000-0000-000000000000)這樣一來調(diào)用NewGuid()方法時(shí)則始終返回0值了,也可以在調(diào)用Guid(bool)時(shí)傳入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字節(jié)整數(shù)入棧,我們將其中的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

(注意,這里的操作很簡(jiǎn)單,所以很單純地修改了,若對(duì)于比較復(fù)雜的操作請(qǐng)先學(xué)習(xí)IL相關(guān)知識(shí))
然后保存你的修改。

6,編譯IL代碼,生成新的DLL

利用ms提供的ilasm可以將IL文件編譯成dll:

生成新的DLL


 (編譯前別忘記關(guān)閉文本編輯器,比如ultraEdit會(huì)獨(dú)占文件而導(dǎo)致無法訪問)

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

你可能會(huì)想到按照MSDN上提到的方法就如同安裝自己普通的程序集一樣將其安裝到GAC,大概能猜想到這是不可行的,否則”不安全了“。 或者,我們剛才不是記錄了mscorlib的路徑的嗎,直接復(fù)制粘貼進(jìn)去覆蓋不就行了,也許可以,也許不可以,只所以說不可以,原因有可能有二,一是根本不讓訪問頁(yè)不讓覆蓋,二是程序.net程序運(yùn)行時(shí)會(huì)檢查程序集版本。那么就試試看吧:
直接訪問指定的路徑看來是不行的了,正如下圖所示:

檢查路徑


不過沒關(guān)系,我們可以通過第三方工具訪問到該目錄,可以通過剛才的FileMon,雙擊條目可以打開相應(yīng)的文件目錄,還有一種更常用的方便的方式是用TotalCommander,其可以方便的訪問Windows的各種隱藏路徑。

訪問Windows的各種隱藏路徑""


 將文件拖放到對(duì)應(yīng)目錄便可以覆蓋了.

8, 刪除程序集的本機(jī)映像(native image)

回到剛才用FileMon監(jiān)視mscorlib訪問時(shí),大家可能會(huì)發(fā)現(xiàn)我們的小程序直接訪問的并非mscorlib.dll, 而是一個(gè)名為mscorlib.ni.dll的文件(在C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\9adb89fa22fd5b4ce433b5aca7fb1b07\ 路徑下),這是mscorlib.dll的本機(jī)映像(native image), 關(guān)心過.net優(yōu)化的朋友應(yīng)該會(huì)知道我們可以通過ngen來將程序集生成本機(jī)映像以提高運(yùn)行速度. 那么程序?qū)⒅苯尤ピL問該映像而非我們修改過的mscorlib.dll,這會(huì)導(dǎo)致我們的修改看不到效果。所以我們要將該映像刪除。為什么是刪除,而不是將修改過的mscorlib.dll利用ngen來生成一個(gè)新的映像而覆蓋之? 原因很簡(jiǎn)單,大家自己想想吧。
首先,利用ngen uninstall 命令從本機(jī)映像緩存中卸載本地映像,然后利用TotalCommander將其刪除(注意,先關(guān)閉可以對(duì)所覆蓋的程序集有所引用的應(yīng)用程序,最好重啟一下電腦,應(yīng)該不用進(jìn)安全模式刪那么費(fèi)勁)

9,驗(yàn)證一下修改.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對(duì)某些程序集的引用來自于C:\Program Files\Reference Assemblies 下,所以,對(duì)于某些程序集如果要對(duì)VS引用造成影響則應(yīng)該覆蓋C:\Program Files\Reference Assemblies下的對(duì)應(yīng)文件。這里的mscorlib不需要)

【編輯推薦】

  1. 淺談.NET Framework中的Stream.Read方法
  2. 淺析.NET Framework中XML數(shù)據(jù)處理
  3. .net framework3.5新特性2:新增匿名類
  4. 微軟公布下一代Visual Studio和.NET Framework平臺(tái)
  5. 配置Visual Studio 2008來調(diào)試.NET Framework源碼的基本步驟
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2011-01-06 10:39:25

.NET程序打包

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2009-07-30 14:10:40

ASP.NET版本

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2023-07-04 07:37:20

AzureOpenAI操作手冊(cè)

2009-11-02 15:33:53

VB.NET Data

2022-07-28 16:06:08

app分身

2022-06-06 08:50:40

CIOIT轉(zhuǎn)型

2014-08-08 13:22:54

測(cè)試手機(jī)站點(diǎn)移動(dòng)設(shè)備

2021-01-19 09:06:21

MysqlDjango數(shù)據(jù)庫(kù)

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2023-04-26 12:46:43

DockerSpringKubernetes

2021-11-09 06:55:03

水印圖像開發(fā)

2010-07-06 09:38:51

搭建私有云

2010-07-06 09:43:57

搭建私有云

2011-02-22 13:46:27

微軟SQL.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)