当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 经典教程:用.net动态创建类的实例

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

ASP.NET 中的 经典教程:用.net动态创建类的实例


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 72 ::
收藏到网摘: n/a

看了网上很多关于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