新聞中心
.NET Frame work編譯機制(二次編譯)
C++和.Net程序采用了兩種不同的編譯方式。通常一個C++編寫的程序,都是一次編譯成二進制的代碼,在相應的操作系統(tǒng)平臺上直接執(zhí)行即可。而.Net程序采用兩次編譯的方式,用C#,VB.Net等語言寫成的程序被編譯成IL代碼,通過CLR在運行的時候JIT編譯成為本地二進制代碼。

創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站設計、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的天壇街道網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
MFC和WinForm很多設計上的不同從根本上說,都是因為編譯模式帶來的不同。因此,在仔細探討MFC和WinForm之前,有必要細細體會一下不同編譯方式帶來的改變。
考慮一段代碼,它需要在不同的編譯環(huán)境下生成不同的代碼,或者是為了減少代碼編寫量用一些替換方式取代類似的代碼。在C++中利用預編譯和宏來解決這些事情。MFC框架中,更是大量使用宏來進行核心功能的設計。但是宏只是一種巧妙的減少輸入代碼量的方式,本質(zhì)上和手寫輸入一些代碼并無區(qū)別(也許不夠嚴密吧),它并不能在程序運行的時候動態(tài)支持代碼的插入和改變,因為此時它已經(jīng)編譯完成了。而二次編譯則不同,你可以將它的第一次編譯看成是通常一次編譯程序的預編譯期,只是這個預編譯更為的強大,它可以編譯生成信息更為豐富的元數(shù)據(jù)。并且,只要在JIT執(zhí)行前動態(tài)插入代碼,利用反射等手段,就可以將已經(jīng)編譯好的程序的行為在某種程度上進行改變,其動態(tài)性能得到了本質(zhì)上的改變。
因此,在MFC和WinForm中,我們可以看到兩者在動態(tài)性能,安全性和效率方面都有很大的不同,總結一下,都可以歸結到這不同的編譯模式上來。在以后的日志中,都可以看到這些區(qū)別的
vb點虐 多個過程handles一個事件
這個執(zhí)行順序由點虐 內(nèi)部處理和維護
現(xiàn)在我測試了下,如果動態(tài)添加delegate的話,那么事件調(diào)用就會按照添加的先后順序來執(zhí)行
不過在過程里直接用"handles 某個事件"來指定的話,順序就不一定了,比如我測試你的代碼就是3,1,2的循序,和處理過程的名字應該沒什么關系
不過事件的處理過程會按照在invocation list里的循序來執(zhí)行
給你一段代碼
Function GetHandlers(ByVal instance As Object, ByVal e As String) As String
Dim pi As PropertyInfo = GetType(Button).GetProperty("Events", BindingFlags.Instance Or BindingFlags.NonPublic)
Dim ehl As EventHandlerList = CType(pi.GetValue(instance, Nothing), EventHandlerList)
Dim fi As FieldInfo = GetType(Control).GetField("Event" e, BindingFlags.Static Or BindingFlags.NonPublic)
Dim d As [Delegate] = ehl(fi.GetValue(Nothing))
Dim handlerStr As String = Nothing
If (d Nothing) Then
For Each i As [Delegate] In d.GetInvocationList()
handlerStr = handlerStr i.Method.Name vbCrLf
Next
Else
handlerStr = "無"
End If
Return handlerStr
End Function
調(diào)用gethandlers函數(shù)可以得到某個控件的某個事件注冊的所有handler,這個順序就是真正的調(diào)用順序了
但我覺得還是應該不要太過依賴這部分內(nèi)容,不管是用handles還是addhandler,現(xiàn)在是這樣,以后的版本說不定就變成其他了,因為ms并沒有對他們有過任何的明文說明
Visual Basic .NET的編譯
.NET語言,包括VB.NET,它們所開發(fā)的程序源代碼并不是直接編譯成能夠直接在操作系統(tǒng)上執(zhí)行的二進制本地代碼,而是被編譯成為中間代碼,然后通過.NET Framework的通用語言運行時(CLR)——執(zhí)行?!∷械?Net編程語言都被編譯成這種被稱為MSIL(Microsoft Intermediate Language )的中間代碼,這與Java的字節(jié)碼類似。因此雖然最終的程序在表面上仍然與傳統(tǒng)意義上的可執(zhí)行文件都具有“.exe”的后綴名。但是實際上,如果計算機上沒有安裝.Net Framework,那么這些程序?qū)⒉荒軌虮粓?zhí)行。在程序執(zhí)行時,.Net Framework將中間代碼翻譯成為二進制機器碼,從而使它得到正確的運行。最終的二進制代碼被存儲在一個緩沖區(qū)中。所以一旦程序使用了相同的代碼,那么將會調(diào)用緩沖區(qū)中的版本。這樣如果一個.Net程序第二次被運行,那么這種翻譯不需要進行第二次,速度會明顯加快。
VB.NET代碼之所以不直接編譯成二進制機器碼,是基于.NET跨平臺這一目標的考慮。 Visual Basic .NET 2002
2002年Visual Basic .NET 問世,此后Visual Basic 包含在 Visual Studio套裝中。該版本又被稱為VB 7.0,是與C#一起在2002年發(fā)布的最初始的VB點虐 版本。C#是一門新設計.Net語言并且語法上和Java有一定的相似性,所以被大力宣傳為微軟對付JAVA的王牌,受到媒體極力關注。然而VB.NET則相反被錯誤地認為僅僅是VB的一個升級(故有時被稱為VB7),它的受關注度也因此較低,當然VB社區(qū)以及喜歡Basic系列風格的語言的人還是很關注它的。那些試用過此版VB.NET的人在層層幕布下發(fā)現(xiàn)一個強大卻艱深的語言。不過任何一種語言都是有弱點的,當然后面這一點也是.NET語言的共性,那就是運行的計算機上必須裝相應版本的.Net framework。
Visual Basic .NET 2003
該版本是和.NET Framework 1.1一起發(fā)布的。新功能包括對.NET Compact Framework的支持和更好的VB升遷向?qū)?。并改進了運行狀況,IDE穩(wěn)定性(尤其是后臺編譯器),以及運行時RunTime穩(wěn)定性。另外,VB.NET2003還有一個學院版Visual Studio .NET 2003 Academic Edition (VS03AE),它是分發(fā)給各國某些學者免費使用的版本。
Visual Basic .NET 2005
該版本是VB.Net的重大轉(zhuǎn)變。但是這個版本的 Visual Studio 仍然還是面向 .NET 框架的(版本2.0)。它同時也能開發(fā)跨平臺的應用程序,如開發(fā)使用微軟操作系統(tǒng)的手機的程序等??傮w來說是一個非常龐大的軟件,甚至包含代碼測試功能。
Visual Basic .NET 2008
Visual Basic 2008于2008年2月1日發(fā)布。通過幾年的發(fā)展,它已成為一種專業(yè)化的開發(fā)語言和環(huán)境。用戶可用 Visual Basic 快速創(chuàng)建 Windows 程序,現(xiàn)在還可以編寫企業(yè)水平的客戶/服務器程序及強大的數(shù)據(jù)庫應用程序。
Visual Studio 2010
Visual Studio 2010于2010年4月12日上市,其中包含 Visual Basic .NET 2010 。Visual Studio是微軟公司推出的開發(fā)環(huán)境。是目前最流行的Windows平臺應用程序開發(fā)環(huán)境。Visual Studio 2010集成開發(fā)環(huán)境(IDE)的界面被重新設計和組織,變得更加簡單明了。Visual Studio 2010同時帶來了 NET Framework 4.0、Microsoft Visual Studio 2010 CTP( Community Technology Preview--CTP),并且支持開發(fā)面向Windows 7的應用程序。除了Microsoft SQL Server,它還支持 IBM DB2和Oracle數(shù)據(jù)庫等。
Visual Studio 2012
從該版本開始VB.NET已沒有單獨發(fā)售的IDE了,微軟給Visual Basic .NET 以及C#開發(fā)者的IDE就只有Visual Studio 了。該版本增加了modern(原metro)風格的支持等眾多新特性。
Visual Studio 2015
增加了大量新特性,提升你的編寫效率。對編譯器和開發(fā)環(huán)境優(yōu)化,提高編譯速度,幫你重構代碼和解決錯誤。最明顯的14項改進見參考資料的14 Top Improvements in Visual Basic 14。 不能簡單認為VB 點虐 是VB的新版本。首先它們一個是完全面向?qū)ο蟮恼Z言,而另一個不是完全面向?qū)ο蟮模浯蜼B .NET是構建于.Net framework之上的。當然,它們同屬Basic系列語言,又同為微軟所開發(fā),語法上有一定的相似或沿襲是很正常的,但不能因此認為VB .NET是VB的升級版。
對于想從VB轉(zhuǎn)到VB .NET的開發(fā)者來說,如果你只是喜歡Basic系列語言的代碼風格,那么你的遷移會很順利,如果你想沿襲之前VB的編程思想和習慣,你會很苦惱,原因之一就是VB .NET貫穿的是完全面向?qū)ο蟮乃枷?,而VB不是。
微軟為使VB開發(fā)者更容易轉(zhuǎn)到VB .NET,兼容一些VB6函數(shù)和庫的用法,但是比不上.NET語言中自帶的可替換的函數(shù)和庫來得高效,所以我們應該盡量使用.NET下的新方法。微軟還提供了VB到VB .NET的自動轉(zhuǎn)換器,雖幾經(jīng)改進,但仍無法轉(zhuǎn)換全部代碼,幾乎所有非小型程序都需要人工修改以完成編譯。為了運行優(yōu)化,大多程序需要大量工作去重構。
爭議與解釋:許多資深的VB程序員抱怨VB .NET,因為VB .NET丟掉了許多不再發(fā)行的VB6中使用的大量語言constructs和用戶界面功能,并且對保留下來的東西也改變了語意。其實不應該再把VB和VB .NET做功能上的比較,因為它們除了有些語法相似外,可以說是完全不同的兩種語言。
Visual Basic .NET與VB都代表了Basic系列語言的編碼風格,Visual Basic .NET是這種編碼風格在.NET平臺上的繼承,而不是同系列語言VB的沿襲。
語言革命
* 1991年4月,Visual Basic誕生,Visual Basic 1.0 Windows版本發(fā)布。這個連接編程語言和用戶界面的進步被稱為Tripod(有些時候叫做Ruby),最初的設計是由阿蘭·庫珀(Alan Cooper)完成的。 1992年9月,Visual Basic 1.0 DOS版本發(fā)布。
* 1998年夏天,VB6.0發(fā)布。
* 2001年,Visual Basic .NET和.NET Framework發(fā)布。Visual Basic .NET正式誕生。
* 2005年,微軟宣布將不會再對非.NET版本的VB進行支持。
*2010年,Visual Basic .NET隨Visual Studio 2010發(fā)布,不再提供單獨的Visual Basic .NET IDE。 MONO開發(fā)平臺提供了一個VB.NET特性庫(VB.NET-specific libraries)并著手研發(fā)一個編譯器和Windows Forms GUI 庫。由于各方面的原因,VB.NET開發(fā)的開源工具較C#發(fā)展得慢一些。
VB.NET控件的一些事件的觸發(fā)順序是什么
一個一個回答吧。
1、CheckBox 的 MouseDown 事件發(fā)生在 CheckedChange 事件之前,但這是指在單步調(diào)試的狀態(tài)下,事實上在編譯好的程序中,這兩個事件是分別處在兩個不同的線程中,單純的考慮時間上的前后沒有意義。
2、MouseDown 在先。Scroll 事件發(fā)生在滾動條移動的過程中,而 ValueChange 事件發(fā)生在滾動條的 Value 屬性發(fā)生改變的時候,兩者沒有必然聯(lián)系。舉例,當你用鼠標拖動滾動條移動的時候,這時發(fā)生的是 Scroll 事件;松開鼠標鍵后,Value 屬性值改變,這時候觸發(fā) ValueChange 事件。另外,如果滾動條的 Value 是通過代碼改變的而非鼠標拖動的,是不觸發(fā) Scroll 事件只觸發(fā) ValueChange 事件。
3、ClientSize 是指控件的工作區(qū)的高度和寬度。比如說 form,它的 Size 值是包括標題欄、邊框等,而 ClientSize 是工作區(qū),不包括標題欄、邊框等。
4、一般是 Load→Paint→Shown。
網(wǎng)站題目:vb點虐 編譯順序 vbs編譯
當前URL:http://m.biofuelwatch.net/article/ddggscg.html


咨詢
建站咨詢
