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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

ASP.NET 中的 用.net动态创建类的实例


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

用.net动态创建类的实例

看了网上很多关于DotNet动态创建类的实例的文章,我这里想总结一下,其实方法很简单,就是用“Activator.CreateInstance”。但是这个方法需要待创建的类的Type作为参数,为了获得该参数,可以利用[Assembly].GetType方法,这个方法只需要待创建的类的名称(名称字符串)就可以了,最后的问题就是要获得这个类所在的程序集。如何获得待创建的类所在程序集,那么就解决了这个问题。

其实,在获得程序集这个问题上,可以有更简单的办法,以下是我的做法。

利用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