• 用.net动态创建类的实例 (转)


      看了网上很多关于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(ByVal sourceName As StringByVal DLLPath As StringByRef ReturnDLLName As StringAs 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 Class1
        
    Public i As Integer
    End Class

    http://www.cnblogs.com/futureflare/archive/2007/05/17/750687.html

    看完后,初步设想,在数据库中,如果我们新建立一个表,那么都需要对应一个实体类,运用该方法,我们是否可以动态的创建该实体类,而不需要更新实体类的dll。有待实践。
  • 相关阅读:
    简明Secure boot介绍
    密码学有什么用?
    mkimage, no such file or dir
    嵌入式系统安全简介
    希尔排序
    jQuery选择器
    css 选择器
    安装 SQL Server 2008 和管理工具 SQL Server 2008 management studio 及相关问题解决
    mac下安装安卓开发环境
    IOS开发小记-内存管理
  • 原文地址:https://www.cnblogs.com/VirtualMJ/p/751118.html
Copyright © 2020-2023  润新知