經典教程:用.net動態創建類的實例_.Net教程
推薦:關于C#靜態構造函數的幾點說明靜態構造函數是C#的一個新特性,其實好像很少用到。不過當我們想初始化一些靜態變量的時候就需要用到它了。這個構造函數是屬于類的,而不是屬于哪里實例的,就是說這個構造函數只會被執行一次。
看了網上很多關于DotNet動態創建類的實例的文章,我這里想總結一下,其實方法很簡單,就是用“Activator.CreateInstance”。但是這個方法需要待創建的類的Type作為參數,為了獲得該參數,可以利用[Assembly].GetType方法,這個方法只需要待創建的類的名稱(名稱字符串)就可以了,最后的問題就是要獲得這個類所在的程序集。如何獲得待創建的類所在程序集,那么就解決了這個問題。
大家可以參考http://www.cnblogs.com/ShadowK/archive/2006/11/14/560131.html,費了很多筆墨寫了一個比較完整的動態構造類的設計器。其實,在獲得程序集這個問題上,可以有更簡單的辦法,以下是我的做法。
利用Microsoft.VisualBasic.VBCodeProvider(),如果是C#可以用CSharpCodeProvider(),將類文件編譯成為DLL文件,然后利用[Assembly].LoadFrom("DLL 的絕對路徑")加載該DLL。這樣我們可以避免在那些創建DLL和Type的復雜代碼。我告訴我的項目組成員這個例子后,強調要打開思路,Simple is perfect,凡事都盡量找簡便的方法來實現,客戶永遠不會為我們那些復雜的代碼多花一分錢。
1.執行編譯任務的方法:
以下為引用的內容: Public Shared Function CompileExecutable()Function CompileExecutable(ByVal sourceName As String, ByVal DLLPath As String, ByRef ReturnDLLName As String) As Boolean Dim sourceFile As FileInfo = New FileInfo(sourceName) Dim provider As CodeDomProvider = Nothing Dim compileOk As Boolean = False ' 根據原文件的擴展名選擇code provider If sourceFile.Extension.ToUpper(CultureInfo.InvariantCulture) = ".CS" Then provider = New Microsoft.CSharp.CSharpCodeProvider() ElseIf sourceFile.Extension.ToUpper(CultureInfo.InvariantCulture) = ".VB" Then provider = New Microsoft.VisualBasic.VBCodeProvider() Else Console.WriteLine("原文件必須包含 .cs 或 .vb 擴展名") End If If Not provider Is Nothing Then ' 構造DLL文件的全路徑 Dim dllName As String = String.Format("{0}\{1}.dll", _ DLLPath, _ sourceFile.Name.Replace(".", "_")) ReturnDLLName = dllName Dim cp As CompilerParameters = New CompilerParameters() ' 設置編譯控制參數 cp.GenerateExecutable = False '生成DLL,如果是True則生成exe文件 cp.OutputAssembly = dllName cp.GenerateInMemory = False cp.TreatWarningsAsErrors = False ' 調用編譯方法將原代碼文件編譯成DLL Dim cr As CompilerResults = provider.CompileAssemblyFromFile(cp, _ sourceName) If cr.Errors.Count > 0 Then ' 顯示編譯錯誤 Console.WriteLine("編譯錯誤 {0} 編譯成 {1}", _ sourceName, cr.PathToAssembly) Dim ce As CompilerError For Each ce In cr.Errors Console.WriteLine(" {0}", ce.ToString()) Console.WriteLine() Next ce Else ' 顯示編譯成功的消息 Console.WriteLine("原文件 {0} 編譯成 {1} 成功完成.", _ sourceName, cr.PathToAssembly) End If ' 返回編譯結果 If cr.Errors.Count > 0 Then compileOk = False Else compileOk = True End If End If Return compileOk End Function |
2.編譯DLL,并動態創建類的實例。(這里類的原文件是Class1.vb文件,放在WebSite的App_Code文件夾中了,實際使用時可以放在任意物理位置。)
以下為引用的內容: Dim strSourceFileName As String = Server.MapPath("~/App_Code/Class1.vb") '類文件的全路徑 Dim strDllPath As String = Server.MapPath("~/App_Code") '編譯后的DLL文件存放的位置 Dim strDllName As String = "" 'DLL的全路徑(返回值) CompileExecutable(strSourceFileName, strDllPath, strDllName) '編譯原文件為DLL文件 Dim a As [Assembly] = [Assembly].LoadFrom(strDllName) '加載DLL Dim myType As System.Type = a.GetType("Class1") '獲得Class1的Type Dim obj As Object = Activator.CreateInstance(myType) '獲得Class1的實例 |
3.Class1.vb原文件
以下為引用的內容: Public Class Class1Class Class1 Public i As Integer End Class |
分享:MSDN Visual系列:創建SharePoint Services解決方案包WSSv3引入了一種名為“解決方案包”的部署機制。這套機制可以支持將解決方案作為一個整體單元來部署。這樣,我們就可以方便的維護,測試和多次的重復使用。我們可以將制作好的SharePo
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-經典教程:用.net動態創建類的實例。