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

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

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


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