用.net動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例_.Net教程
推薦:ASP.NET 2.0 里輸出文本格式流在用 ASP.NET 編程時(shí),打開(kāi)一個(gè)頁(yè)面一般是通過(guò)指定超鏈接地址,調(diào)用指定的頁(yè)面文件(.html、.aspx)等方法。 但是,如果即將打開(kāi)的頁(yè)面文件的內(nèi)容是在程序中動(dòng)態(tài)生成,或者是從數(shù)據(jù)庫(kù)的表里取出
用.net動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例
看了網(wǎng)上很多關(guān)于DotNet動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例的文章,我這里想總結(jié)一下,其實(shí)方法很簡(jiǎn)單,就是用“Activator.CreateInstance”。但是這個(gè)方法需要待創(chuàng)建的類(lèi)的Type作為參數(shù),為了獲得該參數(shù),可以利用[Assembly].GetType方法,這個(gè)方法只需要待創(chuàng)建的類(lèi)的名稱(chēng)(名稱(chēng)字符串)就可以了,最后的問(wèn)題就是要獲得這個(gè)類(lèi)所在的程序集。如何獲得待創(chuàng)建的類(lèi)所在程序集,那么就解決了這個(gè)問(wèn)題。
其實(shí),在獲得程序集這個(gè)問(wèn)題上,可以有更簡(jiǎn)單的辦法,以下是我的做法。
利用Microsoft.VisualBasic.VBCodeProvider(),如果是C#可以用CSharpCodeProvider(),將類(lèi)文件編譯成為DLL文件,然后利用[Assembly].LoadFrom("DLL 的絕對(duì)路徑")加載該DLL。這樣我們可以避免在那些創(chuàng)建DLL和Type的復(fù)雜代碼。我告訴我的項(xiàng)目組成員這個(gè)例子后,強(qiáng)調(diào)要打開(kāi)思路,Simple is perfect,凡事都盡量找簡(jiǎn)便的方法來(lái)實(shí)現(xiàn),客戶(hù)永遠(yuǎn)不會(huì)為我們那些復(fù)雜的代碼多花一分錢(qián)。
1.執(zhí)行編譯任務(wù)的方法:
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
' 根據(jù)原文件的擴(kuò)展名選擇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 擴(kuò)展名")
End If
If Not provider Is Nothing Then
' 構(gòu)造DLL文件的全路徑
Dim dllName As String = String.Format("{0}\{1}.dll", _
DLLPath, _
sourceFile.Name.Replace(".", "_"))
ReturnDLLName = dllName
Dim cp As CompilerParameters = New CompilerParameters()
' 設(shè)置編譯控制參數(shù)
cp.GenerateExecutable = False '生成DLL,如果是True則生成exe文件
cp.OutputAssembly = dllName
cp.GenerateInMemory = False
cp.TreatWarningsAsErrors = False
' 調(diào)用編譯方法將原代碼文件編譯成DLL
Dim cr As CompilerResults = provider.CompileAssemblyFromFile(cp, _
sourceName)
If cr.Errors.Count > 0 Then
' 顯示編譯錯(cuò)誤
Console.WriteLine("編譯錯(cuò)誤 {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
' 返回編譯結(jié)果
If cr.Errors.Count > 0 Then
compileOk = False
Else
compileOk = True
End If
End If
Return compileOk
End Function
2.編譯DLL,并動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例。(這里類(lèi)的原文件是Class1.vb文件,放在WebSite的App_Code文件夾中了,實(shí)際使用時(shí)可以放在任意物理位置。)
Dim strSourceFileName As String = Server.MapPath("~/App_Code/Class1.vb") '類(lèi)文件的全路徑
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的實(shí)例
3.Class1.vb原文件
Public Class Class1Class Class1
Public i As Integer
End Class
分享:從XML文件中讀取數(shù)據(jù)綁定到DropDownList1 、綁定DropDownList: 以下為引用的內(nèi)容: ddl_language.DataSource = createDataSource(); ddl_language.DataTextField = "languageText
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶(hù)端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- ASP.NET立即上手教程(2)
- 復(fù)雜ASP.NET服務(wù)器控件調(diào)整小技巧
- 解析asp.net開(kāi)發(fā)與web標(biāo)準(zhǔn)的沖突問(wèn)題
- ADO.NET實(shí)用經(jīng)驗(yàn)無(wú)保留曝光
- asp.net2.0學(xué)習(xí)歷程-菜鳥(niǎo)到中級(jí)程序員的飛躍
- Flex與.NET互操作:基于WebService的數(shù)據(jù)訪問(wèn)
- 解析ASP.NET Routing對(duì)請(qǐng)求的處理方式
- 在客戶(hù)端驗(yàn)證密碼強(qiáng)度[2],兼容FireFox和IE
- 如何利用.NET Framework使用RSS feed
- ASP.NET1.1中動(dòng)態(tài)樹(shù)的實(shí)現(xiàn)
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索用.net動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例
- 教程說(shuō)明:
.Net教程-用.net動(dòng)態(tài)創(chuàng)建類(lèi)的實(shí)例
。