• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·南昌市
    聊天 送礼
    • 查看作者
    • 用.net动态创建类的实例

      【简 介】

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

        

       

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

      vb.net封装组件成com的方法
      VB.Net调用存储过程并得到返回值,详解VB.NET对象浏览器作用体现,老生常谈:从VB6迁移到VB.net,VB.net2008精彩实例,窗体应用技巧,用VB.net2008打造你的影音播放器,一个Office 2003风格的通知控件(VB.NET),在VB.NET中操作MySQL数据库,vb.net开发中使用excel插件的代码,vb.net封装组件成com的方法,.NET环境下几种不同的邮件发送解决方案,用.net动态创建类的实例,VB.NET实现DataList横向数据交替变色,在VB.Net中创建使用控件数组,在Visual Basic .NET 中实现后台进程,VB.NET中使用Directsound9之简单播放,用新VB.NET 枚举提高效率,在有Clipboard的应用程序间移动数据,VB.NET中的变量范围差异,从Visual Basic 6.0 到 Visual Basic.NET 的转换,微软.Net程序设计FAQ
      VB.net

      那么就解决了这个问题。 

      大家可以参考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 

      vb.net封装组件成com的方法
      VB.Net调用存储过程并得到返回值,详解VB.NET对象浏览器作用体现,老生常谈:从VB6迁移到VB.net,VB.net2008精彩实例,窗体应用技巧,用VB.net2008打造你的影音播放器,一个Office 2003风格的通知控件(VB.NET),在VB.NET中操作MySQL数据库,vb.net开发中使用excel插件的代码,vb.net封装组件成com的方法,.NET环境下几种不同的邮件发送解决方案,用.net动态创建类的实例,VB.NET实现DataList横向数据交替变色,在VB.Net中创建使用控件数组,在Visual Basic .NET 中实现后台进程,VB.NET中使用Directsound9之简单播放,用新VB.NET 枚举提高效率,在有Clipboard的应用程序间移动数据,VB.NET中的变量范围差异,从Visual Basic 6.0 到 Visual Basic.NET 的转换,微软.Net程序设计FAQ
      VB.net

    • 0
    • 0
    • 0
    • 61
    • 单栏布局 侧栏位置: