.NET教程之--.NET動(dòng)態(tài)創(chuàng)建類的實(shí)例解析_.Net教程
推薦:解析.Net編程接口剖析系列之比較和排序我們知道,與C 相比較,C#以及整個(gè).Net并不支持多繼承,而相應(yīng)的,C#支持了接口,并且支持一個(gè)類型實(shí)現(xiàn)多個(gè)接口。對(duì)于接口的概念,相信大部分讀者已經(jīng)有了很好的了解,而我這里談?wù)剛(gè)人對(duì)
看了網(wǎng)上很多關(guān)于DotNet動(dòng)態(tài)創(chuàng)建類的實(shí)例的文章,我這里想總結(jié)一下,其實(shí)方法很簡單,就是用“Activator.CreateInstance”。但是這個(gè)方法需要待創(chuàng)建的類的Type作為參數(shù),為了獲得該參數(shù),可以利用[Assembly].GetType方法,這個(gè)方法只需要待創(chuàng)建的類的名稱(名稱字符串)就可以了,最后的問題就是要獲得這個(gè)類所在的程序集。如何獲得待創(chuàng)建的類所在程序集,那么就解決了這個(gè)問題。
利用Microsoft.VisualBasic.VBCodeProvider(),如果是C#可以用CSharpCodeProvider(),將類文件編譯成為DLL文件,然后利用[Assembly].LoadFrom("DLL 的絕對(duì)路徑")加載該DLL。這樣我們可以避免在那些創(chuàng)建DLL和Type的復(fù)雜代碼。我告訴我的項(xiàng)目組成員這個(gè)例子后,強(qiáng)調(diào)要打開思路,Simple is perfect,凡事都盡量找簡便的方法來實(shí)現(xiàn),客戶永遠(yuǎn)不會(huì)為我們那些復(fù)雜的代碼多花一分錢。
1.執(zhí)行編譯任務(wù)的方法:
以下為引用的內(nèi)容: PublicSharedFunctionCompileExecutable()FunctionCompileExecutable(ByValsourceNameAsString,ByValDLLPathAsString,ByRefReturnDLLNameAsString)AsBoolean DimsourceFileAsFileInfo=NewFileInfo(sourceName) DimproviderAsCodeDomProvider=Nothing DimcompileOkAsBoolean=False '根據(jù)原文件的擴(kuò)展名選擇codeprovider IfsourceFile.Extension.ToUpper(CultureInfo.InvariantCulture)=".CS"Then provider=NewMicrosoft.CSharp.CSharpCodeProvider() ElseIfsourceFile.Extension.ToUpper(CultureInfo.InvariantCulture)=".VB"Then provider=NewMicrosoft.VisualBasic.VBCodeProvider() Else Console.WriteLine("原文件必須包含.cs或.vb擴(kuò)展名") EndIf IfNotproviderIsNothingThen '構(gòu)造DLL文件的全路徑 DimdllNameAsString=String.Format("{0}{1}.dll",_ DLLPath,_ sourceFile.Name.Replace(".","_")) ReturnDLLName=dllName DimcpAsCompilerParameters=NewCompilerParameters() '設(shè)置編譯控制參數(shù) cp.GenerateExecutable=False'生成DLL,如果是True則生成exe文件 cp.OutputAssembly=dllName cp.GenerateInMemory=False cp.TreatWarningsAsErrors=False '調(diào)用編譯方法將原代碼文件編譯成DLL DimcrAsCompilerResults=provider.CompileAssemblyFromFile(cp,_ sourceName) Ifcr.Errors.Count>0Then '顯示編譯錯(cuò)誤 Console.WriteLine("編譯錯(cuò)誤{0}編譯成{1}",_ sourceName,cr.PathToAssembly) DimceAsCompilerError ForEachceIncr.Errors Console.WriteLine("{0}",ce.ToString()) Console.WriteLine() Nextce Else '顯示編譯成功的消息 Console.WriteLine("原文件{0}編譯成{1}成功完成.",_ sourceName,cr.PathToAssembly) EndIf '返回編譯結(jié)果 Ifcr.Errors.Count>0Then compileOk=False Else compileOk=True EndIf EndIf ReturncompileOk EndFunction |
2.編譯DLL,并動(dòng)態(tài)創(chuàng)建類的實(shí)例。(這里類的原文件是Class1.vb文件,放在WebSite的App_Code文件夾中了,實(shí)際使用時(shí)可以放在任意物理位置。)
以下為引用的內(nèi)容: DimstrSourceFileNameAsString=Server.MapPath("~/App_Code/Class1.vb")'類文件的全路徑 DimstrDllPathAsString=Server.MapPath("~/App_Code")'編譯后的DLL文件存放的位置 DimstrDllNameAsString=""'DLL的全路徑(返回值) CompileExecutable(strSourceFileName,strDllPath,strDllName)'編譯原文件為DLL文件 DimaAs[Assembly]=[Assembly].LoadFrom(strDllName)'加載DLL DimmyTypeAsSystem.Type=a.GetType("Class1")'獲得Class1的Type DimobjAsObject=Activator.CreateInstance(myType)'獲得Class1的實(shí)例 |
3.Class1.vb原文件
以下為引用的內(nèi)容:
PublicClassClass1ClassClass1 |
分享:揭秘.net基礎(chǔ)知識(shí)錯(cuò)誤注意二十二點(diǎn)知識(shí)1:command調(diào)用存儲(chǔ)過程的時(shí)候,如果輸出是dataset,selectcommand的command對(duì)象的connection先要指出,否則catch一輩子也是空的.. 2:存儲(chǔ)過程的varchar字段如果是x.x的這種格式,容易出現(xiàn)細(xì)
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- ASP.NET 頁面事件執(zhí)行順序介紹
- 淺析vc.net中配置OpenOffice的SDK應(yīng)用開發(fā)
- 揭秘ASP.NET常用的26個(gè)優(yōu)化性能方法
- ASP.NET畫圖全攻略(下)
- 在ASP.NET中使用AJAX的簡單方法
- 關(guān)于VS2012自帶的 性能分析 工具使用實(shí)例(圖文介紹)
- 用事實(shí)說話!AJAX應(yīng)用程序開發(fā)七宗罪
- ASP.NET 2.0中動(dòng)態(tài)修改頁面標(biāo)題
- 解決Asp.net MVC中頁面標(biāo)題的方法
- Asp.net中使用PageDataSource分頁實(shí)現(xiàn)代碼
- 相關(guān)鏈接:
復(fù)制本頁鏈接| 搜索.NET教程之--.NET動(dòng)態(tài)創(chuàng)建類的實(shí)例解析
- 教程說明:
.Net教程-.NET教程之--.NET動(dòng)態(tài)創(chuàng)建類的實(shí)例解析。