国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

VB.NET中的動態代碼生成技巧

開發 后端
通常,VB.NET程序員會創建一個靜態設計,而這一設計可以為程序的應用提供所需的一切。但是,在某些情況下,程序員或許不能夠事先預計每種需求,這里就需要用到動態代碼生成了。

本文的討論也將著眼于這兩種情況。首先是當程序員需要動態建立一個控件并將代碼附著于控件之上時。例如,你或許想創建一個鏈接列表,但是不知道需要創建鏈接的數量或是鏈接中會出現什么樣的數據。第二種是當程序員需要定義代碼以反映出特殊需求的時候。例如,你或許要執行能反映用戶系統配置的代碼。

類似上述的情況當然不會每天都上演。事實上,它們只在非常情況下才出現。然而,作為程序員,仍然要意識到.NET為解決動態情形提供了方案。有了正確的技巧,你就可以寫出能靈活處理動態情況的應用程序了。

使用動態控件

許多程序員總會遇到需要動態創建控件的時候。我們所展示的例子中程序員向FlowLayoutPanel中添加了LinkLabels?;蛟S你可以個這樣的設置來記錄和保存常用的URL,文件,網絡地址或是其他資源所在位置的數值。這一示例沒有真正保存鏈接,但是你可以使用XML序列化功能來實現保存。

每次當用戶點擊Test按鈕時,示例代碼就會動態創建一個新的LinkLabel控件。真正的演示代碼并不復雜。例一就展示了創建這類控件以及將控件放入FlowLayoutPanel,lstLabel中通常所需要做的一切。

例一:向FlowLayoutPanel中添加新的鏈接

  1. Private Sub btnTest_Click()   
  2. Handles btnTest.Click   
  3. ' Create a link.   
  4. Dim NewLink As LinkLabel =  
  5. New LinkLabel()   
  6. ' Add some properties to it.   
  7. NewLink.Text = DateTime.Now   
  8. .ToLongTimeString()   
  9. ' Set the click event handler.   
  10. AddHandler NewLink.Click,   
  11. AddressOf NewLink_Click   
  12. ' Place the button on the form.   
  13. lstLinks.Controls.Add(NewLink)   
  14. End Sub 


 如你所料,該代碼開始的時候創建了一個新的LinkLabel并為其賦予了一些值。這一示例使用的是當前時間。你的代碼或許能夠對某一真實資源進行訪問。

請注意該代碼也向鏈接的Click事件中指定了一個處理程序。你必須使用示例中的AddHandler技巧,因為普通的Handles關鍵詞路徑不起作用。一方面,設計應用程序的時候你并不清楚控件的名稱。即便你為控件指定了一個名稱,你也不知道用戶要創建的控件數量,所以我們沒有辦法清楚會有多少處理程序會被創建。處理程序的代碼與控件代碼類似,因此沒有必要創建多個處理程序。用于這個示例的處理代碼見例二。例二:處理動態控件點擊事件

  1. Private Sub NewLink_Click( _   
  2. ByVal sender As System.Object, ByVal e As System.EventArgs)  
  3. ' Verify that you actually have a LinkLabel  
  4. If Not sender.GetType() Is GetType(LinkLabel) Then  
  5. MessageBox.Show("Wrong control type provided!")  
  6. Return  
  7. End If  
  8. ' Convert the input sender to a Button.  
  9. Dim ThisLink As LinkLabel = sender 
  10. ' Show that we have the correct button.  
  11. MessageBox.Show("You created this link at: " + ThisLink.Text)  
  12. End Sub 

 
你可能已經注意到例一中的事件處理器使用的是寬松代表——它沒有將ByVal發送器作為System.Object,也沒有將ByVal e作為System.EventArgs作為參數因為它不需要這二者。然而,當你創建一個事件處理器來動態創建控件時,通常你需要將ByVal發送器作為System.Object參數,這意味著將這兩者都包含其中。

有些程序員在創建事件處理器的時候會出現一個錯誤,即沒有檢查傳入控件的類型。發送器對象可能包含多選擇,而如果未對事件處理器進行事件處理類型的設置,那么你就會面臨更多的選擇。我們的示例代碼一開始就檢查了傳入控件對象的類型。這樣以來發送器就不會像下面所展示的代碼一樣:      

  1. Private Sub btnTest2_Click() Handles btnTest2.Click   
  2. ' Create a link.  
  3. Dim NewButton As Button = New Button()  
  4. ' Add some properties to it.  
  5. NewButton.Text = DateTime.Now.ToLongTimeString()  
  6. ' Set the click event handler.  
  7. AddHandler NewButton.Click, AddressOf NewLink_Click  
  8. ' Place the button on the form.  
  9. lstLinks.Controls.Add(NewButton)  
  10. End Sub 


 此代碼在FlowLayoutPanel中創建了一個按鈕,大多數情況下這都能正常運行,除非事件處理器不按照按鈕所示的進行操作。如果你打算服務多個控件類型,那么每個控件類型都需要一個獨特的處理。你可以使用多事件處理器或者為某些類型提供選擇標準。

NewLink_Click()事件處理器照常將傳入發送器轉換成指定類型,在這個示例中則是LinkLabel。該代碼可以訪問LinkLabel屬性并能用其他方式進行互動。在我們的示例中,只顯示了一個能在創建鏈接的時候告知我們的對話框。

使用動態代碼

在運行時創建一個控件是在無法確定應用程序功能的時候采取的一種策略。但是動態創建控件并不適用于所有的情況。有些時候你必須建立可執行代碼,雖然你的應用程序運行的目的是補償不同極其之間的配置,不同用戶的需求,不同的環境需求或是其他要求。當應用程序所運行的電腦不存在控件,那么通常是需要創建動態代碼的。

幸運的是,.NET為我們提供了一系列動態代碼選項。例如,你可以創建一個可執行的能獨立運行的程序或是可以想運行中的程序加載一個DLL然后再執行。當你需要演示一個外部任務的時候可以使用選擇可執行,如運行一種腳本——該DLL選項最適合擴大現有的應用程序功能。

你可以運行來自文件或內存的動態代碼。當你需要不止一次地運行代碼時,可以使用文件。對代碼的檢查可以再次運行外部文件而不需要對其進行二次編譯。當你需要多次演示任務的時候,如一個安裝請求,那可以使用內存圖像。

當然我們也可以更改源代碼。例如,你可以使用字符串來建立需要在應用程序中直接使用的代碼。如果你需要代碼具有高度靈活性,且代碼本身不是很長時,這一方法的優勢就非常顯著。也可以從文件里建立代碼,就如同VS一樣。這一方法最適用于相對穩定且不需要復雜編碼的需求。第三種選擇是使用Documentation Object Model來創建代碼并將其作為CodeDom樹型結構的一個系列。該樹型結構包括了CodeCormpileUnits。這就像是用DOM模式創建了一個XML文件。

使用動態創建代碼的***方式是用示例來檢查一下。例三展示了一個基本“Hello World”示例。該示例用源代碼直接創建了代碼因此你可以看到整個運行以及生成一個外部可執行文件的過程。

例三:動態編碼示例

  1.  Private Sub btnTest3_Click() Handles btnTest3.Click   
  2. ' Create a compiler.  
  3. Dim Comp As VBCodeProvider = New VBCodeProvider()  
  4. ' Define the parameters for the code you want to compile.  
  5. Dim Parms As CompilerParameters = New CompilerParameters)  
  6.  
  7. ' We do want to create an executable, rather than a DLL.  
  8. Parms.GenerateExecutable = True 
  9. ' The compiler will create an output assembly called Output.  
  10. Parms.OutputAssembly = "Output" 
  11. ' The compiler won't treat warnings as errors.  
  12. Parms.TreatWarningsAsErrors = False 
  13. ' Add any assembly you want to reference.  
  14. Parms.ReferencedAssemblies.Add("System.Windows.Forms.dll")  
  15.  
  16. ' Define the code you want to run.  
  17.  
  18. Dim SampleCode As StringBuilder = New StringBuilder()  
  19.  
  20. SampleCode.Append("Imports System.Windows.Forms" + vbCrLf)  
  21.  
  22. SampleCode.Append("Module TestAssembly" + vbCrLf)  
  23.  
  24. SampleCode.Append("Sub Main()" + vbCrLf)  
  25.  
  26. SampleCode.Append("MessageBox.Show(" + Chr(34) + _  
  27. "Dynamically Created Code!" + _Chr(34) + ")" + vbCrLf)  
  28. SampleCode.Append("End Sub" + vbCrLf)  
  29. SampleCode.Append("End Module" + vbCrLf)  
  30. ' Define the code to run.  
  31. Dim Executable As CompilerResults = _ 
  32. Comp.CompileAssemblyFromSource(Parms, SampleCode.ToString())  
  33. ' Display error messages if there are any.  
  34. If Executable.Errors.HasErrors Then  
  35. For Each Item As CompilerError In Executable.Errors  
  36. MessageBox.Show(Item.ErrorText)  
  37. Next  
  38. Else  
  39. ' If there aren't any error messages, start the  
  40. ' executable.  
  41. Process.Start("Output")  
  42. End If  
  43. End Sub 

一開始你創建了一個使用VBCodeProvider的編譯器Comp。舊一點的.NET版本使用的是不同的方法但是這里所講的是微軟推薦的一個新方法。
為了使用編譯器,你必須創建能描述應用程序的參數。這些參數類似于VS中你創建的參數,只是現在你可以對它們進行定義。該代碼一開始就將GenerateExecutable設置為True,這意味著你需要的是一個EXE文件而不是DLL。

Parms.OutputAssembly屬性包含了輸出文件的名稱。你只需要在想創建文件時提供這一信息即可,而不需要生成可執行內存了。如果你ixiang生成可執行文件的內存版本,可以將Parm.GenerateInMemory屬性設置為True。

使用Parm.TreatWarningsAsErrors屬性來確定如何處理警告信息。默認的設置會使其為錯誤,這意味著你的應用程序可能無法對其進行編譯。大多數程序員使用默認設置,盡管他們開發了程序,但是在開發完成的程序中卻將其設置為False。

大多數應用程序需要外部DLL以正常運行。當然,你不能創建任意的沒有引用外部DLL的Windows表單程序。通常,你要使用Reference文件夾來完成這一任務。不過,當你動態創建代碼的時候可以依賴于Parms.ReferencedAssemblies屬性。如下所示,只需添加你要的DLL即可。

現在,你已經定義了項目,接下來需要為其創建源代碼。如前文所述,你可以依賴于一個外部文件或DOM模式。然后,該示例創建了代碼因此你可以看到整個過程。下面是代碼的原始形式:

  1. Imports System.Windows.Forms   
  2. Module TestAssembly  
  3. Sub Main()  
  4. MessageBox.Show("Dynamically Created Code!")  
  5. End Sub  
  6. End Module 

這個簡單的例子顯示了一個對話框。注意vbCrLf的使用。如果你不使用這一方法,那編譯器會發送給你一個錯誤信息。vbCrLf條目在該代碼中所起的作用與在程序代碼中的作用相同,只是添加的方式不一樣。

從這一點老說,你***會用Comp.CompileAsseblyFromSource()方法編譯代碼。當使用DOM模式和文件的時候可以使用這一方法。而在所有三種情況中,編譯器用參數和源代碼創建了你請求的輸出。該運算的輸出出現在Executable中,是CompilerResults類型。

編譯的失敗次數多于程序員的預計。無論你是在哪里使用動態編碼技巧,你必須假設會出現失敗的情況以及處理失敗的方案。在本例中,代碼尋找的是錯誤并在編譯失敗時將其展示在了信息框中。否則,代碼會依賴于Process.Start()方法來啟用可執行文件。

底線

動態編碼技巧并不是***鑰匙。當你為開發問題找到了好的靜態解決方案時,當然也可以使用。但是在我們所列出的情況中沒有可行的靜態方案,因此要選擇動態編碼技巧。大多數情況下,要用動態編碼技巧解決以下問題:

◆ 用戶的環境會以不可預見的方式更改時;

◆ 無法控制用戶電腦的安裝;

◆ 用戶或應用程序都添加了你要用控件執行的數據要素;

◆ 應用程序必須執行很早以前的安裝任務,且這些任務與電腦,環境,網絡或其他不確定因素聯系緊密時;

◆ 應用程序要執行了處理級別的任務,且這些任務取決于機器連接或其他狀況。

顯然,還有其他一些情況能使用動態編碼技巧。最重要的是記住但凡有不可預知的情況下要考慮使用動態編碼技巧。通常在編碼環境中出現了靜態代碼無法處理的情況時,我們就可以使用動態編碼技巧。

【編輯推薦】

  1. C#和VB.NET類型相關知識匯總
  2. VB.NET中有用的通用對象列表
  3. VB.NET和C#的發展與動態語言運行時
  4. 用VB.NET 2008編寫數據查詢窗體
  5. VB.NET實現窗體圖標最小化到狀態欄
責任編輯:彭凡 來源: IT專家網論壇
相關推薦

2009-10-12 15:44:26

VB.NET動態編碼技

2010-01-13 18:09:09

VB.NET動態生成代

2010-01-11 16:04:10

VB.NET使用wit

2009-10-12 15:41:09

VB.NET動態代碼

2010-01-18 18:20:49

VB.NET使用API

2009-11-10 13:08:13

VB.NET編程技巧

2009-10-12 15:02:51

VB.NET動態控件

2010-01-11 10:08:47

VB.NET事件通道

2010-01-14 13:59:01

2010-01-18 16:33:57

VB.NET加密文件

2010-01-14 10:18:24

VB.NET List

2010-01-13 15:52:59

VB.NET浮動窗體

2010-01-22 11:02:30

VB.NET創建新變量

2010-01-14 15:44:17

VB.NET數據綁定

2010-01-18 18:50:26

VB.NET鼠標手勢

2010-01-12 18:00:50

VB.NET界面

2010-01-20 18:51:16

VB.NET修改系統時

2010-01-08 18:31:45

VB.NET歷史菜單

2010-01-15 13:52:42

VB.NET屬性設置

2010-01-15 19:04:09

點贊
收藏

51CTO技術棧公眾號

亚洲 高清 成人 动漫| 精品丝袜一区二区三区| 91中文在线观看| 日韩精品一区国产| 91精品国产91久久综合桃花| 国产超级av在线| 麻豆91精品视频| 成人在线观看网址| 国产精品网址| 久久久成人的性感天堂| 青草在线视频在线观看| 福利微拍一区二区| 日本在线аv| 亚洲人成亚洲人成在线观看图片 | 麻豆视频在线观看免费| 亚洲地区一二三色| 欧美精品久久久久久久久25p| 国产一区二区三区av电影| 欧美日韩亚洲综合一区二区三区激情在线| 在线看成人短视频| 日本中文字幕久久看| 欧美经典影片视频网站| 久久99久久99精品中文字幕| 色狠狠一区二区三区| 欧美大片在线免费观看| 国产视频网站一区二区三区| 久久久精品视频在线观看| 午夜精品在线| 国产精品久久久久久搜索| 日韩电影二区| 欧美日韩高清在线一区| 久久久久国产一区二区| 国产精品三级一区二区| 国产综合色精品一区二区三区| 国产一二三四五| 国产亚洲人成网站| 在线看片免费人成视久网| 欧美日韩久久久一区| 国产在线观看91| 操91在线视频| 天天做天天爱天天爽综合网| 日韩免费三级| 亚洲色欲色欲www| 99视频免费在线观看| 色婷婷成人综合| 亚洲激情中文在线| 日韩黄色片在线| 一本大道久久a久久综合婷婷 | 精品女厕一区二区三区| 欧美xxxhd| 成人午夜小视频| 成人激情文学综合网| 青梅竹马是消防员在线| 麻豆国产精品va在线观看不卡| 日韩一级毛片| 亚洲欧美在线精品| 亚洲人成电影网站色| 99精品视频在线| 少妇黄色一级片| 亚洲国产免费av| 中文字幕一区二区三三| 无码少妇一区二区三区芒果| 欧美性xxxxxxxx| 日韩av影院| 欧美视频第三页| 永久免费看mv网站入口亚洲| 狠狠久久婷婷| 成人福利视频导航| 久久久久久999| 不卡区在线中文字幕| 欧美另类tv| 日韩在线电影一区| 日韩女优制服丝袜电影| 亚洲精品一二| 黄网站在线播放| 精品国产二区在线| 欧美日韩和欧美的一区二区| 91精品综合| 日本激情在线观看| 国产精品二区三区四区| 欧美精三区欧美精三区| 丝袜诱惑制服诱惑色一区在线观看 | 精品久久久av| 麻豆国产精品官网| 人人草在线视频| 国产在线视频在线| 欧美超级乱淫片喷水| 日本一区二区三区在线观看| 亚洲二区av| 色偷偷免费视频| 精品久久久久久一区二区里番| 日韩一区二区电影在线| 久久国产免费看| 亚洲一区二区三区免费| 日本人妖在线| 亚洲永久激情精品| 欧美日本亚洲视频| 欧洲中文字幕精品| 成人午夜av在线| 精品国产91| 99re6在线精品视频免费播放| 精品久久久久久久久久中文字幕 | 久久久久国产精品| 怡红院在线观看| 九色91popny| 久久99久久99精品蜜柚传媒| 中文字幕精品视频| 亚洲国产美女搞黄色| 久久婷婷影院| 免费国产自久久久久三四区久久| aaa在线免费观看| 美女少妇一区二区| 鲁丝片一区二区三区| 91精品国产91久久久久久久久 | 七七成人影院| 羞羞免费视频| 中文字幕在线乱| 91免费看网站| 久久99精品国产99久久6尤物| 欧美日韩在线另类| 国产日韩av一区| 国产成人在线电影| 欧美日韩在线大尺度| 亚洲国产国产| 亚洲综合资源| mm视频在线视频| www红色一片_亚洲成a人片在线观看_| 天天摸天天碰天天添| 91手机视频在线| 黑人中文字幕一区二区三区| 啪一啪鲁一鲁2019在线视频| 亚洲视频第一页| 亚洲国产成人在线视频| 欧美日韩成人在线| 欧美日韩在线电影| 欧美午夜精品久久久久久孕妇| 亚洲第一福利一区| 亚洲福利视频三区| 亚洲一区二区三区国产| 水蜜桃亚洲精品| 奇米影视首页 狠狠色丁香婷婷久久综合| 91国语精品自产拍在线观看性色 | 精品国产一级| 国产厕拍一区| 超碰在线成人| 不卡一区2区| 天天射成人网| 久久最新视频| 福利电影一区二区| 久久网站热最新地址| 国产精品乱人伦中文| 亚洲综合丝袜美腿| 精品视频一区 二区 三区| 日韩免费在线观看| 亚洲色图偷窥自拍| 欧美精品videos另类日本| 国产成人欧美在线观看| 国产精品久久久久一区二区| 久久婷婷开心| 免费人成自慰网站| 两个人hd高清在线观看| 在线看av的网址| 欧美日韩激情电影| 精品理论电影在线| 日日夜夜免费精品视频| 久久色在线观看| 色噜噜久久综合| www.亚洲一区| 国产精品我不卡| 999精品网站| 亚洲丝袜一区| 亚洲精品合集| 亚洲天堂1区| 午夜成年人在线免费视频| 国产原创精品在线| 国产精品久久久久一区二区| 日韩精品中文字幕在线| av电影天堂一区二区在线观看| 视频国产精品| 国产精品一在线观看| 国产999精品久久| 在线观看av一区二区| 97视频com| 久久久国内精品| 国产成人无吗| 999久久久免费精品国产| av在线综合网| 精品国产亚洲在线| 亚洲影影院av| 午夜成在线www| 91精品麻豆| 波多野结衣在线一区| 亚洲欧美成人在线| 亚洲国产精品123| 羞羞污视频在线观看| 亚洲女同同性videoxma| 在线观看精品一区| 国产欧美一区二区视频| 尤物视频网站在线观看| 婷婷久久国产对白刺激五月99|