.NET教程之--.NET动态创建类的实例解析_.Net教程
推荐:解析.Net编程接口剖析系列之比较和排序我们知道,与C 相比较,C#以及整个.Net并不支持多继承,而相应的,C#支持了接口,并且支持一个类型实现多个接口。对于接口的概念,相信大部分读者已经有了很好的了解,而我这里谈谈个人对
看了网上很多关于DotNet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用“Activator.CreateInstance”。但是这个方法需要待创建的类的Type作为参数,为了获得该参数,可以利用[Assembly].GetType方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集。如何获得待创建的类所在程序集,那么就解决了这个问题。
利用Microsoft.VisualBasic.VBCodeProvider(),如果是C#可以用CSharpCodeProvider(),将类文件编译成为DLL文件,然后利用[Assembly].LoadFrom("DLL 的绝对路径")加载该DLL。这样我们可以避免在那些创建DLL和Type的复杂代码。我告诉我的项目组成员这个例子后,强调要打开思路,Simple is perfect,凡事都尽量找简便的方法来实现,客户永远不会为我们那些复杂的代码多花一分钱。
1.执行编译任务的方法:
以下为引用的内容: PublicSharedFunctionCompileExecutable()FunctionCompileExecutable(ByValsourceNameAsString,ByValDLLPathAsString,ByRefReturnDLLNameAsString)AsBoolean DimsourceFileAsFileInfo=NewFileInfo(sourceName) DimproviderAsCodeDomProvider=Nothing DimcompileOkAsBoolean=False '根据原文件的扩展名选择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扩展名") EndIf IfNotproviderIsNothingThen '构造DLL文件的全路径 DimdllNameAsString=String.Format("{0}{1}.dll",_ DLLPath,_ sourceFile.Name.Replace(".","_")) ReturnDLLName=dllName DimcpAsCompilerParameters=NewCompilerParameters() '设置编译控制参数 cp.GenerateExecutable=False'生成DLL,如果是True则生成exe文件 cp.OutputAssembly=dllName cp.GenerateInMemory=False cp.TreatWarningsAsErrors=False '调用编译方法将原代码文件编译成DLL DimcrAsCompilerResults=provider.CompileAssemblyFromFile(cp,_ sourceName) Ifcr.Errors.Count>0Then '显示编译错误 Console.WriteLine("编译错误{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 '返回编译结果 Ifcr.Errors.Count>0Then compileOk=False Else compileOk=True EndIf EndIf ReturncompileOk EndFunction |
2.编译DLL,并动态创建类的实例。(这里类的原文件是Class1.vb文件,放在WebSite的App_Code文件夹中了,实际使用时可以放在任意物理位置。)
以下为引用的内容: 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的实例 |
3.Class1.vb原文件
以下为引用的内容:
PublicClassClass1ClassClass1 |
分享:揭秘.net基础知识错误注意二十二点知识1:command调用存储过程的时候,如果输出是dataset,selectcommand的command对象的connection先要指出,否则catch一辈子也是空的.. 2:存储过程的varchar字段如果是x.x的这种格式,容易出现细
- 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教程之--.NET动态创建类的实例解析。