當前位置:首頁 » 編程軟體 » spy編譯器

spy編譯器

發布時間: 2022-06-17 12:45:17

A. 如何利用ILSPY反編譯工具重建C#NETWeb源碼解決方案

點擊ILSpy.exe運行反編譯軟體。

點擊這個文件夾圖標,選擇你需要反編譯的.net程序

然後就會出現你選擇的程序,如圖

點擊所選程序前面的加號,找到程序的啟動窗口form1,點擊查看代碼

繼續展開每行的代碼前面的「+」號,就可以查看具體的代碼

如果查看的程序太多太亂,你可以右鍵移除該程序,如下圖所示

B. 使用ILSpy反編譯,get_Chars(14)是返回的啥

獲取字元串指定位置的字元

C. ILSpy反編譯DLL文件後改動其中一小部分,怎麼再將其編譯到該DLL中

如果改動很小,可以用一些支持.net元數據分析的工具比如CFF Explorer找到方法的位置,用16進制編輯工具修改方法體。也有直接支持分析和修改的比如SAE,還有作為插件的Reflexil之類的。修改比較復雜那就自己用基礎工具比如Cecil或者dnlib之類來修改程序集。當然也可以全部反編譯,修改後再編譯。這種又臟又累的活小女子做不合適,還是考慮交給男人吧。

D. 如何使用ilspy反編譯.exe程序

網路搜索ILspy, 並進入官網下載該軟體
1

下載完成後,將ILspy的壓縮解壓
2

雙擊ILspy打開該軟體
3

打開該軟體後,點擊File後,再點擊打開
4

在打開窗口裡找到你想反編譯的程序後,...
5

現在我們就可以看到

E. ilspy反編譯exe後只顯示form.cs,沒有form.design.cs,應該怎麼改

它們是partial class,編譯的時候是合二為一的,所以反編譯也沒法區分。
designer里的在InitializeComponent()函數裡面。

F. 對於一款編譯器,其支持的語言版本信息如何得知。例如,IAR 中的C_SPY 支持標準的C語言嗎

這個具體編譯器的信息要看編譯器的使用手冊吧,裡面應該有編譯器的特性信息,應該注意的地方之類的。

G. 如何用XMLSpy生成高效的代碼

現代的手持設備,與其說是電話,更像一台拿在手中的電腦。但是,即使是「最快」的手持設備,其性能也趕不上一台普通的台式電腦。

這就是為什麼我們在書寫Android應用程序的時候要格外關注效率。這些設備並沒有那麼快,並且受電池電量的制約。這意味著,設備沒有更多的能力,我們必須把程序寫的盡量有效。

本文討論了很多能讓開發者使他們的程序運行更有效的方法,遵照這些方法,你可以使你的程序發揮最大的效力。

簡介

對於佔用資源的系統,有兩條基本原則:

不要做不必要的事

不要分配不必要的內存

所有下面的內容都遵照這兩個原則。

有些人可能馬上會跳出來,把本節的大部分內容歸於「草率的優化」(xing:參見[The Root of All Evil]),不可否認微優化(micro-optimization。xing:代碼優化,相對於結構優化)的確會帶來很多問題,諸如無法使用更有效的數據結構和演算法。但是在手持設備上,你別無選擇。假如你認為Android虛擬機的性能與台式機相當,你的程序很有可能一開始就佔用了系統的全部內存(xing:內存很小),這會讓你的程序慢得像蝸牛一樣,更遑論做其他的操作了。

Android的成功依賴於你的程序提供的用戶體驗。而這種用戶體驗,部分依賴於你的程序是響應快速而靈活的,還是響應緩慢而僵化的。因為所有的程序都運行在同一個設備之上,都在一起,這就如果在同一條路上行駛的汽車。而這篇文檔就相當於你在取得駕照之前必須要學習的交通規則。如果大家都按照這些規則去做,駕駛就會很順暢,但是如果你不這樣做,你可能會車毀人亡。這就是為什麼這些原則十分重要。

當我們開門見山、直擊主題之前,還必須要提醒大家一點:不管VM是否支持實時(JIT)編譯器(xing:它允許實時地將java解釋型程序自動編譯成本機機器語言,以使程序執行的速度更快。有些JVM包含JIT編譯器。),下面提到的這些原則都是成立的。假如我們有目標完全相同的兩個方法,在解釋執行時foo()比bar()快,那麼編譯之後,foo()依然會比bar()快。所以不要寄希望於編譯器可以拯救你的程序。

避免建立對象

世界上沒有免費的對象。雖然GC為每個線程都建立了臨時對象池,可以使創建對象的代價變得小一些,但是分配內存永遠都比不分配內存的代價大。

如果你在用戶界面循環中分配對象內存,就會引發周期性的垃圾回收,用戶就會覺得界面像打嗝一樣一頓一頓的。

所以,除非必要,應盡量避免盡力對象的實例。下面的例子將幫助你理解這條原則:

當你從用戶輸入的數據中截取一段字元串時,盡量使用substring函數取得原始數據的一個子串,而不是為子串另外建立一份拷貝。這樣你就有一個新的String對象,它與原始數據共享一個char數組。
如果你有一個函數返回一個String對象,而你確切的知道這個字元串會被附加到一個StringBuffer,那麼,請改變這個函數的參數和實現方式,直接把結果附加到StringBuffer中,而不要再建立一個短命的臨時對象。
一個更極端的例子是,把多維數組分成多個一維數組。

int數組比Integer數組好,這也概括了一個基本事實,兩個平行的int數組比(int,int)對象數組性能要好很多。同理,這試用於所有基本類型的組合。
如果你想用一種容器存儲(Foo,Bar)元組,嘗試使用兩個單獨的Foo[]數組和Bar[]數組,一定比(Foo,Bar)數組效率更高。(也有例外的情況,就是當你建立一個API,讓別人調用它的時候。這時候你要注重對API借口的設計而犧牲一點兒速度。當然在API的內部,你仍要盡可能的提高代碼的效率)

總體來說,就是避免創建短命的臨時對象。減少對象的創建就能減少垃圾收集,進而減少對用戶體驗的影響。

使用本地方法

當你在處理字串的時候,不要吝惜使用String.indexOf(), String.lastIndexOf()等特殊實現的方法(specialty methods)。這些方法都是使用C/C++實現的,比起Java循環快10到100倍。

使用實類比介面好

假設你有一個HashMap對象,你可以將它聲明為HashMap或者Map:

Map myMap1 = new HashMap();HashMap myMap2 = new HashMap();
哪個更好呢?

按照傳統的觀點Map會更好些,因為這樣你可以改變他的具體實現類,只要這個類繼承自Map介面。傳統的觀點對於傳統的程序是正確的,但是它並不適合嵌入式系統。調用一個介面的引用會比調用實體類的引用多花費一倍的時間。

如果HashMap完全適合你的程序,那麼使用Map就沒有什麼價值。如果有些地方你不能確定,先避免使用Map,剩下的交給IDE提供的重構功能好了。(當然公共API是一個例外:一個好的API常常會犧牲一些性能)

用靜態方法比虛方法好

如果你不需要訪問一個對象的成員變數,那麼請把方法聲明成static。虛方法執行的更快,因為它可以被直接調用而不需要一個虛函數表。另外你也可以通過聲明體現出這個函數的調用不會改變對象的狀態。

不用getter和setter

在很多本地語言如C++中,都會使用getter(比如:i = getCount())來避免直接訪問成員變數(i = mCount)。在C++中這是一個非常好的習慣,因為編譯器能夠內聯訪問,如果你需要約束或調試變數,你可以在任何時候添加代碼。

在Android上,這就不是個好主意了。虛方法的開銷比直接訪問成員變數大得多。在通用的介面定義中,可以依照OO的方式定義getters和setters,但是在一般的類中,你應該直接訪問變數。

將成員變數緩存到本地

訪問成員變數比訪問本地變數慢得多,下面一段代碼:

for (int i = 0; i < this.mCount; i++)mpItem(this.mItems[i]);
再好改成這樣:

int count = this.mCount;Item[] items = this.mItems; for (int i = 0; i < count; i++)mpItems(items[i]);
(使用"this"是為了表明這些是成員變數)

另一個相似的原則是:永遠不要在for的第二個條件中調用任何方法。如下面方法所示,在每次循環的時候都會調用getCount()方法,這樣做比你在一個int先把結果保存起來開銷大很多。

for (int i = 0; i < this.getCount(); i++)mpItems(this.getItem(i));
同樣如果你要多次訪問一個變數,也最好先為它建立一個本地變數,例如:

protected void drawHorizontalScrollBar(Canvas canvas, int width, int height) {if (isHorizontalScrollBarEnabled()) {int size = mScrollBar.getSize(false);if (size <= 0) {size = mScrollBarSize;}mScrollBar.setBounds(0, height - size, width, height);mScrollBar.setParams(computeHorizontalScrollRange(),computeHorizontalScrollOffset(),computeHorizontalScrollExtent(), false);mScrollBar.draw(canvas);}}

這里有4次訪問成員變數mScrollBar,如果將它緩存到本地,4次成員變數訪問就會變成4次效率更高的棧變數訪問。

另外就是方法的參數與本地變數的效率相同。

使用常量

讓我們來看看這兩段在類前面的聲明:

static int intVal = 42;static String strVal = "Hello, world!";
必以其會生成一個叫做<clinit>的初始化類的方法,當類第一次被使用的時候這個方法會被執行。方法會將42賦給intVal,然後把一個指向類中常量表的引用賦給strVal。當以後要用到這些值的時候,會在成員變數表中查找到他們。

下面我們做些改進,使用「final"關鍵字:

static final int intVal = 42;static final String strVal = "Hello, world!";
現在,類不再需要<clinit>方法,因為在成員變數初始化的時候,會將常量直接保存到類文件中。用到intVal的代碼被直接替換成42,而使用strVal的會指向一個字元串常量,而不是使用成員變數。

將一個方法或類聲明為"final"不會帶來性能的提升,但是會幫助編譯器優化代碼。舉例說,如果編譯器知道一個"getter"方法不會被重載,那麼編譯器會對其採用內聯調用。

你也可以將本地變數聲明為"final",同樣,這也不會帶來性能的提升。使用"final"只能使本地變數看起來更清晰些(但是也有些時候這是必須的,比如在使用匿名內部類的時候)(xing:原文是 or you have to, e.g. for use in an anonymous inner class)

謹慎使用foreach

foreach可以用在實現了Iterable介面的集合類型上。foreach會給這些對象分配一個iterator,然後調用 hasNext()和next()方法。你最好使用foreach處理ArrayList對象,但是對其他集合對象,foreach相當於使用 iterator。

下面展示了foreach一種可接受的用法:

public class Foo {int mSplat;static Foo mArray[] = new Foo[27]; public static void zero() {int sum = 0;for (int i = 0; i < mArray.length; i++) {sum += mArray[i].mSplat;}} public static void one() {int sum = 0;Foo[] localArray = mArray;int len = localArray.length;for (int i = 0; i < len; i++) {sum += localArray[i].mSplat;}} public static void two() {int sum = 0;for (Foo a: mArray) {sum += a.mSplat;}}}

在zero()中,每次循環都會訪問兩次靜態成員變數,取得一次數組的長度。

retrieves the static field twice and gets the array length once for every iteration through the loop.

在one()中,將所有成員變數存儲到本地變數。 pulls everything out into local variables, avoiding the lookups.

two()使用了在java1.5中引入的foreach語法。編譯器會將對數組的引用和數組的長度保存到本地變數中,這對訪問數組元素非常好。但是編譯器還會在每次循環中產生一個額外的對本地變數的存儲操作(對變數a的存取)這樣會比one()多出4個位元組,速度要稍微慢一些。

綜上所述:foreach語法在運用於array時性能很好,但是運用於其他集合對象時要小心,因為它會產生額外的對象。

避免使用枚舉

枚舉變數非常方便,但不幸的是它會犧牲執行的速度和並大幅增加文件體積。例如:

public class Foo {public enum Shrubbery { GROUND, CRAWLING, HANGING }}

會產生一個900位元組的.class文件(Foo$Shubbery.class)。在它被首次調用時,這個類會調用初始化方法來准備每個枚舉變數。每個枚舉項都會被聲明成一個靜態變數,並被賦值。然後將這些靜態變數放在一個名為"$VALUES"的靜態數組變數中。而這么一大堆代碼,僅僅是為了使用三個整數。

這樣:

Shrubbery shrub = Shrubbery.GROUND;會引起一個對靜態變數的引用,如果這個靜態變數是final int,那麼編譯器會直接內聯這個常數。

一方面說,使用枚舉變數可以讓你的API更出色,並能提供編譯時的檢查。所以在通常的時候你毫無疑問應該為公共API選擇枚舉變數。但是當性能方面有所限制的時候,你就應該避免這種做法了。

有些情況下,使用ordinal()方法獲取枚舉變數的整數值會更好一些,舉例來說,將:

for (int n = 0; n < list.size(); n++) {if (list.items[n].e == MyEnum.VAL_X)// do stuff 1else if (list.items[n].e == MyEnum.VAL_Y)// do stuff 2}

替換為:

int valX = MyEnum.VAL_X.ordinal();int valY = MyEnum.VAL_Y.ordinal();int count = list.size();MyItem items = list.items(); for (int n = 0; n < count; n++){int valItem = items[n].e.ordinal(); if (valItem == valX)// do stuff 1else if (valItem == valY)// do stuff 2}

會使性能得到一些改善,但這並不是最終的解決之道。

將與內部類一同使用的變數聲明在包范圍內

請看下面的類定義:

public class Foo {private int mValue; public void run() {Inner in = new Inner();mValue = 27;in.stuff();} private void doStuff(int value) {System.out.println("Value is " + value);} private class Inner {void stuff() {Foo.this.doStuff(Foo.this.mValue);}}}

這其中的關鍵是,我們定義了一個內部類(Foo$Inner),它需要訪問外部類的私有域變數和函數。這是合法的,並且會列印出我們希望的結果"Value is 27"。

問題是在技術上來講(在幕後)Foo$Inner是一個完全獨立的類,它要直接訪問Foo的私有成員是非法的。要跨越這個鴻溝,編譯器需要生成一組方法:

static int Foo.access$100(Foo foo) {return foo.mValue;}static void Foo.access$200(Foo foo, int value) {foo.doStuff(value);}

內部類在每次訪問"mValue"和"doStuff"方法時,都會調用這些靜態方法。就是說,上面的代碼說明了一個問題,你是在通過介面方法訪問這些成員變數和函數而不是直接調用它們。在前面我們已經說過,使用介面方法(getter、setter)比直接訪問速度要慢。所以這個例子就是在特定語法下面產生的一個「隱性的」性能障礙。

通過將內部類訪問的變數和函數聲明由私有范圍改為包范圍,我們可以避免這個問題。這樣做可以讓代碼運行更快,並且避免產生額外的靜態方法。(遺憾的是,這些域和方法可以被同一個包內的其他類直接訪問,這與經典的OO原則相違背。因此當你設計公共API的時候應該謹慎使用這條優化原則)

避免使用浮點數

在奔騰CPU出現之前,游戲設計者做得最多的就是整數運算。隨著奔騰的到來,浮點運算處理器成為了CPU內置的特性,浮點和整數配合使用,能夠讓你的游戲運行得更順暢。通常在桌面電腦上,你可以隨意的使用浮點運算。

但是非常遺憾,嵌入式處理器通常沒有支持浮點運算的硬體,所有對"float"和"double"的運算都是通過軟體實現的。一些基本的浮點運算,甚至需要毫秒級的時間才能完成。

甚至是整數,一些晶元有對乘法的硬體支持而缺少對除法的支持。這種情況下,整數的除法和取模運算也是有軟體來完成的。所以當你在使用哈希表或者做大量數學運算時一定要小心謹慎。

H. 如何使用spy ++

spy++ 是微軟 Visual Studio 編譯器自帶的一款工具。它可以顯示系統對象(包括進程、線程和窗口)之間關系的圖形樹,搜索指定的窗口、線程、進程或消息, 查看選定的窗口、線程、進程或消息的屬性等等。因此,在 spy++ 的幫助下,我們進行程序調試將容易得多。
下面,我們通過一個簡單的示例,來教大家如何使用 spy++ 查看指定窗口的屬性。

方法/步驟
用 VS 打開一個工程,點擊啟動按鈕。程序運行後,顯示一個窗口。

點擊 VS 菜單「工具」 - 「spy++」,啟動 spy++。。

點擊 spy++ 工具欄中的 望遠鏡 圖標,彈出一個「窗口搜索」的對話框。在「窗口搜索」對話框中,滑鼠左鍵在 查找程序工具 後面的 圖標 處按下不放,將此圖標拖移到我們想要知道信息的窗口內,再松開滑鼠。

此時,「窗口搜索」對話框內將顯示該要查找信息的窗口的句柄、標題和類名。查看完畢後,單擊確定。

「窗口搜索」對話框關閉後,spy++ 將高亮顯示我們要查找信息的窗口。如果該窗口是一個父窗口(即它還包含子窗口),則前面會有 + 號。點擊 + 號展開,可以查看它包含的子窗口信息。
步驟閱讀

如果想查看某個子窗口的信息,則可以在該子窗口行右擊滑鼠,選擇 屬性,彈出 屬性檢查器 窗口。
步驟閱讀
在屬性檢查器窗口中,該窗口的大小位置坐標、樣式(含擴展樣式)、窗口句柄(含父窗口句柄等)、所屬類(包括窗口類名、實例句柄、圖標、游標句柄等信息)、進程(包含進程ID和線程ID)信息就一覽無余了。

I. 如何用ILspy反編譯一個程序

網路搜索ILspy, 並進入官網下載該軟體
下載完成後,將ILspy的壓縮包解壓
雙擊ILspy打開該軟體
打開該軟體後,點擊File後,再點擊打開
在打開窗口裡找到你想反編譯的程序後,再點擊打開
現在我們就可以看到該程序的源碼了
如果我們想把這段源碼導出一個cs文件,我們就選中你想導出的一個類,點擊File 再點擊Save code 然後再選擇路徑即可導出cs文件了!
8
現在我們就可以用Visual Studio或SharpDevelop打開這個cs文件了!

J. 我用spy++查找窗口句柄,但是是十六進制的,我該怎樣用這個句柄呢

HWND handle=(HWND)X2051A;

不好意思
少了個0

HWND handle=(HWND)0X2051A;

0X2051A就是表示16進制的數

熱點內容
python解析post請求 發布:2025-05-17 17:27:19 瀏覽:696
社保測算密碼是什麼 發布:2025-05-17 17:25:09 瀏覽:156
phpini修改路徑 發布:2025-05-17 17:19:06 瀏覽:280
mac搭建php開發環境 發布:2025-05-17 17:18:22 瀏覽:782
佟大為關悅上超級訪問 發布:2025-05-17 17:09:50 瀏覽:310
閃迪存儲卡高速 發布:2025-05-17 17:09:14 瀏覽:470
ios文件加密插件 發布:2025-05-17 17:05:48 瀏覽:797
androidbutton自定義 發布:2025-05-17 16:58:34 瀏覽:169
android應用生命周期 發布:2025-05-17 16:53:16 瀏覽:779
珠海四層交換機怎麼配置 發布:2025-05-17 16:50:17 瀏覽:221