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

ASP.NET
二级域名Cookie问题的解决方法
如何为asp.net网站项目添加子项目
asp.net用url重写URLReWriter实现任意二级域名
asp.net 序列化and反序列化演示
asp.net Timer的使用方法
AjaxControlToolKit DropDownExtender(下拉扩展控件)使用方法
AjaxControlToolKit CalendarExtender(日历扩展控件)的使用方法
让GridView只显示特定用户的数据的方法
让GridView只更新某些特定的数据的方法
ajaxControlToolkit中CascadingDropDown的用法说明
axp.net ScriptManager的简单用法
把程序集安装到全局程序集缓存中的步骤
引用全局程序集缓存内的程序集的方法
asp.net COOKIES需要注意的一点
asp.net UrlReWriter使用经验小结
页面导出为Excel的时间格式的问题
asp.net cookie清除的代码
Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
ASP.NET XmlHttp跨域访问实现代码
Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

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


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