MSIL 匯編程序 (Ilasm.exe)
MSIL 匯編程序從 MSIL 匯編語(yǔ)言生成可移植可執(zhí)行的 (PE) 文件?梢赃\(yùn)行結(jié)果可執(zhí)行文件(該文件包含 MSIL 和所需的元數(shù)據(jù))以確定 MSIL 是否按預(yù)期執(zhí)行。
ilasm [options] filename [[options]filename...]
參數(shù) | 說(shuō)明 |
---|---|
filename | .il 源文件的名稱(chēng)。該文件包含元數(shù)據(jù)聲明指令和符號(hào)化 MSIL 指令?梢蕴峁┒鄠(gè)源文件參數(shù),以便用 Ilasm.exe 生成一個(gè) PE 文件。 |
選項(xiàng) | 說(shuō)明 |
---|---|
/alignment=integer | 將 FileAlignment 設(shè)置為由 NT Optional 標(biāo)題中的 integer 指定的值。如果在文件中指定了 .alignment IL 指令,則此選項(xiàng)將重寫(xiě)它。 |
/base=integer | 將 ImageBase 設(shè)置為由 NT Optional 標(biāo)題中的 integer 指定的值。如果在文件指定了 .imagebase IL 指令,則此選項(xiàng)將重寫(xiě)它。 |
/clock | 為指定的 .il 源文件測(cè)量并報(bào)告下列編譯時(shí)間(以毫秒為單位):
分析
修正和鏈接
|
/debug | 包括調(diào)試信息(局部變量名和參數(shù)名以及行號(hào))。 |
/dll | 生成 .dll 文件作為輸出。 |
/exe | 生成可執(zhí)行文件作為輸出。這是默認(rèn)值。 |
/flags=integer | 將 ImageFlags 設(shè)置為由公共語(yǔ)言運(yùn)行庫(kù)標(biāo)題中的 integer 指定的值。如果在文件中指定了 .corflags IL 指令,則此選項(xiàng)將重寫(xiě)它。有關(guān) integer 的有效值的列表,請(qǐng)參見(jiàn) CorHdr.h 中的 COMIMAGE_FLAGS。 |
/key:keyFile | 使用 keyFile 中包含的私鑰編譯具有強(qiáng)簽名的 filename。 |
/key:@keySource | 使用在 keySource 中生成的私鑰編譯具有強(qiáng)簽名的 filename。 |
/listing | 在標(biāo)準(zhǔn)輸出上生成列表文件。如果省略此選項(xiàng),則不生成列表文件。 |
/nologo | 取消顯示 Microsoft 啟動(dòng)標(biāo)題。 |
/output:file.ext | 指定輸出文件名和擴(kuò)展名。默認(rèn)情況下,輸出文件名與第一個(gè)源文件名相同。默認(rèn)擴(kuò)展名為 .exe。如果指定 /dll 選項(xiàng),則默認(rèn)擴(kuò)展名為 .dll。
注意 指定 /output:myfile.dll 并不會(huì)設(shè)置 /dll 選項(xiàng)。如果不指定 /dll,則會(huì)生成名為 myfile.dll 的可執(zhí)行文件。 |
/quiet | 指定安靜模式;不報(bào)告程序集進(jìn)度。 |
/resource:file.res | 在生成的 .exe 或 .dll 文件中包括 *.res 格式的指定資源文件。使用 /resource 選項(xiàng)只能指定一個(gè) .res 文件。 |
/subsystem=integer | 將 subsystem 設(shè)置為由 NT Optional 標(biāo)題中的 integer 指定的值。如果在文件中指定了 .subsystem IL 指令,則此命令將重寫(xiě)它。有關(guān) integer 的有效值的列表,請(qǐng)參見(jiàn) winnt.h 中的 IMAGE_SUBSYSTEM。 |
/? | 顯示此工具的命令語(yǔ)法和選項(xiàng)。 |
注意 Ilasm.exe 的所有選項(xiàng)都不區(qū)分大小寫(xiě),并且根據(jù)前三個(gè)字母識(shí)別。例如,/lis 等效于 /listing 而 /res:myresfile.res 等效于 /resource:myresfile.res。指定參數(shù)的選項(xiàng)接受用冒號(hào) (:) 或等號(hào) (=) 作為選項(xiàng)和參數(shù)之間的分隔符。例如,/output:file.ext 等效于 /output=file.ext。
備注
MSIL 匯編程序有助于工具供應(yīng)商設(shè)計(jì)和實(shí)現(xiàn) MSIL 生成器。通過(guò)使用 Ilasm.exe,工具和編譯器開(kāi)發(fā)人員可以專(zhuān)注于生成 MSIL 和元數(shù)據(jù),而無(wú)需考慮以 PE 文件格式發(fā)出 MSIL。
與面向運(yùn)行庫(kù)的其他編譯器(如 C# 和 Visual Basic .NET)類(lèi)似,Ilasm.exe 不產(chǎn)生中間對(duì)象文件,并且不需要鏈接階段即可形成 PE 文件。
MSIL 匯編程序可以表達(dá)以運(yùn)行庫(kù)為目標(biāo)的編程語(yǔ)言的所有現(xiàn)有元數(shù)據(jù)和 MSIL 功能。這使得用上面任何編程語(yǔ)言編寫(xiě)的托管代碼都可以在 MSIL 匯編程序中充分表達(dá)并且可以用 Ilasm.exe 編譯。
可以將 Ilasm.exe 同它的伙伴工具 Ildasm.exe 一起使用。Ildasm.exe 采用包含 MSIL 代碼的 PE 文件并創(chuàng)建相應(yīng)的文本文件作為 Ilasm.exe 的輸入。這很有用,例如當(dāng)編譯用并非支持所有運(yùn)行庫(kù)元數(shù)據(jù)屬性的編程語(yǔ)言編寫(xiě)的代碼時(shí)。通過(guò) Ildasm.exe 編譯該代碼并運(yùn)行輸出后,可以手動(dòng)編輯結(jié)果 MSIL 文本文件以添加缺少的屬性。然后可以通過(guò) Ilasm.exe 運(yùn)行此文本文件以生成最終的可執(zhí)行文件。
也可以使用此方法從最初由不同的編譯器生成的數(shù)個(gè) PE 文件生成一個(gè) PE 文件。
注意 目前,無(wú)法對(duì)包含嵌入的本機(jī)代碼的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技術(shù)。
為使 Ildasm.exe 和 Ilasm.exe 的這種組合使用盡可能準(zhǔn)確,此匯編程序不執(zhí)行某些簡(jiǎn)單的優(yōu)化,即不推斷是使用短格式指令還是使用長(zhǎng)格式指令。例如,此工具不會(huì)嘗試確定它是否可以用短編碼替換長(zhǎng)編碼,這些長(zhǎng)編碼可能是在 MSIL 源中編寫(xiě)的,也可能是由其他編譯器發(fā)出的。如果需要短編碼,則必須顯式編寫(xiě)該格式。但是,此匯編程序在可能的情況下,還是會(huì)檢查是否有超出范圍的條件。
注意 Ildasm.exe 只對(duì)磁盤(pán)上的文件進(jìn)行操作。它不對(duì)安裝在全局程序集緩存中的文件進(jìn)行操作。
示例
下面的命令對(duì) MSIL 文件 myTestFile.il
進(jìn)行匯編并產(chǎn)生可執(zhí)行文件 myTestFile.exe
。
ilasm myTestFile
下面的命令對(duì) MSIL 文件 myTestFile.il
進(jìn)行匯編并產(chǎn)生 .dll 文件 myTestFile.dll
。
ilasm myTestFile /dll
下面的命令對(duì) MSIL 文件 myTestFile.il
進(jìn)行匯編并產(chǎn)生 .dll 文件 myNewTestFile.dll
。
ilasm myTestFile /dll /output:myNewTestFile.dll
MSIL 反匯編程序 (Ildasm.exe)
MSIL 反匯編程序是 MSIL 匯編程序 (Ilasm.exe) 的伙伴工具。Ildasm.exe 采用包含 Microsoft 中間語(yǔ)言 (MSIL) 代碼的可移植可執(zhí)行 (PE) 文件,并創(chuàng)建相應(yīng)的文本文件作為 Ilasm.exe 的輸入。
ildasm [options] [PEfilename] [options]
下列選項(xiàng)可用于 .exe、.dll、.obj 和 .lib 文件。
選項(xiàng) | 說(shuō)明 |
---|---|
/output:filename | 創(chuàng)建具有指定 filename 的輸出文件,而不是在對(duì)話(huà)框中顯示結(jié)果。 |
/text | 將結(jié)果顯示到控制臺(tái)窗口,而不是顯示在對(duì)話(huà)框中或顯示為輸出文件。 |
/? | 顯示此工具的命令語(yǔ)法和選項(xiàng)。 |
下列附加選項(xiàng)可用于 .exe 和 .dll 文件。
選項(xiàng) | 說(shuō)明 |
---|---|
/bytes | 以十六進(jìn)制格式顯示作為指令注釋的實(shí)際字節(jié)。 |
/linenum | 包含對(duì)原始源行的引用。 |
/nobar | 取消反匯編進(jìn)度指示器彈出窗口的顯示。 |
/pubonly | 只反匯編公共類(lèi)型和公共成員。等效于 /visibility:PUB。 |
/quoteallnames | 在單引號(hào)中包含所有名稱(chēng)。 |
/raweh | 以原始格式顯示異常處理子句。 |
/source | 顯示作為注釋的原始源行。 |
/tokens | 顯示類(lèi)和成員的元數(shù)據(jù)標(biāo)記。 |
/visibility:vis [+vis ...] | 只反匯編具有指定可見(jiàn)性的類(lèi)型或成員。以下是 vis 的有效值。
|
下列選項(xiàng)僅對(duì)用于文件或控制臺(tái)輸出的 .exe 和 .dll 文件有效。
選項(xiàng) | 說(shuō)明 |
---|---|
/all | 指定 /header、/bytes 和 /tokens 選項(xiàng)的組合。 |
/header | 在輸出中包含文件頭信息。 |
/noil | 取消 MSIL 程序集代碼輸出。 |
/unicode | 對(duì)輸出使用 Unicode 編碼。 |
/utf8 | 對(duì)輸出使用 UTF-8 編碼。默認(rèn)值是 ANSI。 |
下列選項(xiàng)僅對(duì)用于文件或控制臺(tái)輸出的 .exe、.dll、.obj 和 .lib 文件有效。
選項(xiàng) | 說(shuō)明 |
---|---|
/item:class[::method [(sig)]] | 根據(jù)所提供的參數(shù)反匯編下列內(nèi)容:
|
注意 Ildasm.exe 的所有選項(xiàng)不區(qū)分大小寫(xiě),并且由前三個(gè)字母識(shí)別。例如,/quo 等效于 /quoteallnames。指定參數(shù)的選項(xiàng)既可以用冒號(hào) (:) 也可以用等號(hào) (=) 作為選項(xiàng)和參數(shù)之間的分隔符。例如,/output:filename 等效于 /output=filename。
備注
Ildasm.exe 只對(duì)磁盤(pán)上的 PE 文件進(jìn)行操作。它不對(duì)安裝在全局程序集緩存中的文件進(jìn)行操作。
Ildasm.exe 生成的文本文件可以用作 MSIL 匯編程序 (Ilasm.exe) 的輸入。這很有用,例如當(dāng)編譯用并非支持所有運(yùn)行庫(kù)元數(shù)據(jù)屬性的編程語(yǔ)言編寫(xiě)的代碼時(shí)。通過(guò) Ildasm.exe 編譯該代碼并運(yùn)行輸出后,可以手動(dòng)編輯結(jié)果 MSIL 文本文件以添加缺少的屬性。然后可以通過(guò) MSIL 匯編程序運(yùn)行此文本文件以生成最終的可執(zhí)行文件。
注意 目前,無(wú)法對(duì)包含嵌入的本機(jī)代碼的 PE 文件(例如,由 Visual C++ .NET 生成的 PE 文件)使用此技術(shù)。
可以使用 MSIL 反匯編程序中的默認(rèn) GUI,在分層樹(shù)視圖中查看任何現(xiàn)有 PE 文件的元數(shù)據(jù)和反匯編代碼。若要使用此 GUI,請(qǐng)?jiān)诿钚兄墟I入 ildasm,無(wú)需提供 PEfilename 參數(shù)或任何選項(xiàng)。從“文件”菜單中可以定位到希望加載到 Ildasm.exe 中的 PE 文件。若要保存為選定的 PE 顯示的元數(shù)據(jù)和反匯編代碼,請(qǐng)?jiān)凇拔募辈藛沃羞x擇“轉(zhuǎn)儲(chǔ)”命令。若要只保存分層樹(shù)視圖,請(qǐng)?jiān)凇拔募敝羞x擇“轉(zhuǎn)儲(chǔ)樹(shù)視圖”命令。有關(guān)將文件加載到 Ildasm.exe 中和解釋輸出的詳細(xì)指南,請(qǐng)參見(jiàn) Ildasm.exe 教程,該教程位于 .NET Framework SDK 附帶的 Samples 文件夾中。
如果用包含嵌入資源的 PEfilename 參數(shù)提供 Ildasm.exe,則此工具生成多個(gè)輸出文件:一個(gè)包含 MSIL 代碼的文本文件,而每個(gè)嵌入的托管資源都有一個(gè)用該資源在元數(shù)據(jù)中的名稱(chēng)生成的 .resources 文件。如果 PEfilename 中有嵌入的非托管資源,則用 /output 選項(xiàng)為 MSIL 輸出指定的文件名生成 .res 文件。
注意 Ildasm.exe 只顯示 .obj 和 .lib 輸入文件的元數(shù)據(jù)說(shuō)明。不反匯編這些文件類(lèi)型的 MSIL 代碼。
可以對(duì) .exe 或 .dll 文件運(yùn)行 Ildasm.exe 來(lái)確定該文件是否是托管的。如果該文件不是托管的,則此工具將顯示一條信息,說(shuō)明該文件不包含有效的公共語(yǔ)言運(yùn)行庫(kù)頭,并且無(wú)法反匯編。如果該文件是托管的,則此工具將成功運(yùn)行。
示例
下面的命令使 PE 文件 MyHello.exe
的元數(shù)據(jù)和反匯編代碼顯示在 Ildasm.exe 的默認(rèn) GUI 中。
ildasm myHello.exe
下面的命令對(duì) MyFile.exe
文件進(jìn)行反匯編,并將結(jié)果 MSIL 匯編程程序文本存儲(chǔ)在 MyFile.il
文件中。
ildasm MyFile.exe /output:MyFile.il
下面的命令對(duì) MyFile.exe
文件進(jìn)行反匯編,并將結(jié)果 MSIL 匯編程序文本顯示到控制臺(tái)窗口中。
ildasm MyFile.exe /text
如果文件 MyApp.exe
包含嵌入的托管和非托管資源,則下面的命令將產(chǎn)生以下 4 個(gè)文件:MyApp.il
、MyApp.res
、Icons.resources
和 Message.resources
:
ildasm MyApp.exe /output:MyApp.il
下面的命令對(duì) MyFile.exe
的 MyClass
類(lèi)中的 MyMethod
方法進(jìn)行反匯編,并將輸出顯示到控制臺(tái)窗口中。
ildasm /item:MyClass::MyMethod MyFile.exe /text
在上面的示例中,可能有幾個(gè)具有不同簽名的 MyMethod
方法。下面的命令對(duì)返回類(lèi)型為 void 且?guī)в袇?shù) int32 和 System.string 的 MyMethod
方法進(jìn)行反匯編。
ildasm /item:"MyClass::MyMethod(void(int32,class System.String))" MyFile.exe /text
原文在:http://msdn.microsoft.com/library/CHS/cptools/html/cpconmsildisassemblerildasmexe.asp
小提示:如果轉(zhuǎn)載此文,請(qǐng)注明來(lái)源于西部e網(wǎng)(m.wsalc.com),謝謝!