伊缘网 首页
 设为首页    加入收藏    用户帮助    联系我们 
网站首页 新闻动态 技术文章 Flash整站 精彩网文 资源下载 视频教程
网上商城 Flash动漫 网页特效 酷站欣赏 BBS论坛 在线工具 留言本站
  F-CMS Flash CMS   CXT Flash Cms   SXW Flash CMS   EXW Flash Cms   
  您的位置: 伊缘网 >> 网络学堂 >> 建站技术 >> ASP.NET
 阅读文章

用asp.net动态创建类的实例

  文章作者:网络来源:星恋伊缘网浏览次数:3686字体:
 阅读权限:游客身份阅读花费:0 E币添加时间:2007-5-22 上午 02:42:55提交会员:esing
皮具制造生产企业,专注时尚包包
提示:登陆本站会员系统后,网站系统将不显示任何广告!如果您还不是本站会员请注册本站会员,谢谢您对本站的关注!
看了网上很多关于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
  Tags:  esing  .net    实例  
·上篇文章:让你的Vista节省70%的电力
·下篇文章:利用搜索引擎提高流量的简单策略
复制 】 【 打印
 相关文章
·百度资料: 用asp.net动态创建类的实例
·asp.net 上传图片+自动生成缩略图+图片水印功能 2010-6-13 下午 05:28:41
·MS SQL数据库管理指南 2008-12-5 上午 12:14:18
·Dreamweaver CS3序列号大全 2008-9-13 下午 11:01:11
·最新QQ空间代码集合 2008-9-11 上午 12:23:58
·破解网吧不能运行迅雷 2008-7-15 下午 08:57:53
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们尽快予以更正,谢谢。
 相关评论
【文章评论已关闭】
伊缘网