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

ASP.NET
Visual Studio.Net 内幕(7)
.Net 2.0 原汁原味读取注册表
ASP.NET 2.0中预设的cookie
ASP.NET:一段比较经典的多线程学习代码
ASP.NET2.0服务器控件之自定义状态管理
Asp.net给站点某目录增加Aspnet用户
ASP.NET技巧:请求网址并解析返回的html
在Asp.net用C#建立动态Excel
ASP.NET2.0:页面中链入的CSS、js文件带中文时需注意
ASP.NET技巧:数据岛出到Excel最为简易的方法
第一次用.net2.0 LOGIN登陆控件的困惑和解决方法
在ASP.net中保存/取出图片入/从SQL数据库
ASP.NET技巧:做个DataList可分页的数据源
在.NET中利用委托实现窗体间通信
在.NET2.0中使用自定义事务操作
解决 ASP.NET中目录访问权限的问题
ASP.Net防止刷新自动触发事件的解决方案
白刃之战:PHP vs. ASP.NET(节选)-架构比较
C#中使用SendMessage
提取HTML代码中文字的C#函数

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 156 ::
收藏到网摘: 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