熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用.NET動態創建類的實例講解

2013-11-13 11:10:09  來源: .NET編程 

  看了網上很多關於DotNet動態創建類的實例的文章我這裡想總結一下其實方法很簡單就是用ActivatorCreateInstance但是這個方法需要待創建的類的Type作為參數為了獲得該參數可以利用[Assembly]GetType方法這個方法只需要待創建的類的名稱(名稱字符串)就可以了最後的問題就是要獲得這個類所在的程序集如何獲得待創建的類所在程序集那麼就解決了這個問題

  大家可以參考http://wwwcnblogscom/ShadowK/archive////html費了很多筆墨寫了一個比較完整的動態構造類的設計器其實在獲得程序集這個問題上可以有更簡單的辦法以下是我的做法

  利用MicrosoftVisualBasicVBCodeProvider()如果是C#可以用CSharpCodeProvider()將類文件編譯成為DLL文件然後利用[Assembly]LoadFrom(DLL 的絕對路徑)加載該DLL這樣我們可以避免在那些創建DLL和Type的復雜代碼我告訴我的項目組成員這個例子後強調要打開思路Simple is perfect凡事都盡量找簡便的方法來實現客戶永遠不會為我們那些復雜的代碼多花一分錢

  執行編譯任務的方法

以下是引用片段
  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 sourceFileExtensionToUpper(CultureInfoInvariantCulture) = CS Then
  provider = New MicrosoftCSharpCSharpCodeProvider()
  ElseIf sourceFileExtensionToUpper(CultureInfoInvariantCulture) = VB Then
  provider = New MicrosoftVisualBasicVBCodeProvider()
  Else
  ConsoleWriteLine(原文件必須包含 cs 或 vb 擴展名)
  End If
  If Not provider Is Nothing Then
   構造DLL文件的全路徑
  Dim dllName As String = StringFormat({}\{}dll _
  DLLPath _
  sourceFileNameReplace( _))
  ReturnDLLName = dllName
  Dim cp As CompilerParameters = New CompilerParameters()
   設置編譯控制參數
  cpGenerateExecutable = False 生成DLL如果是True則生成exe文件
  cpOutputAssembly = dllName
  cpGenerateInMemory = False
  cpTreatWarningsAsErrors = False
   調用編譯方法將原代碼文件編譯成DLL
  Dim cr As CompilerResults = providerCompileAssemblyFromFile(cp _
  sourceName)
  If crErrorsCount >  Then
   顯示編譯錯誤
  ConsoleWriteLine(編譯錯誤 {} 編譯成 {} _
  sourceName crPathToAssembly)
  Dim ce As CompilerError
  For Each ce In crErrors
  ConsoleWriteLine( {} ceToString())
  ConsoleWriteLine()
  Next ce
  Else
   顯示編譯成功的消息
  ConsoleWriteLine(原文件 {} 編譯成 {} 成功完成 _
  sourceName crPathToAssembly)
  End If
   返回編譯結果
  If crErrorsCount >  Then
  compileOk = False
  Else
  compileOk = True
  End If
  End If
  Return compileOk
  End Function

  編譯DLL並動態創建類的實例(這裡類的原文件是Classvb文件放在WebSite的App_Code文件夾中了實際使用時可以放在任意物理位置)

以下是引用片段
  Dim strSourceFileName As String = ServerMapPath(~/App_Code/Classvb類文件的全路徑
  Dim strDllPath As String = ServerMapPath(~/App_Code編譯後的DLL文件存放的位置
  Dim strDllName As String =  DLL的全路徑(返回值)
  CompileExecutable(strSourceFileName strDllPath strDllName) 編譯原文件為DLL文件
  Dim a As [Assembly] = [Assembly]LoadFrom(strDllName) 加載DLL
  Dim myType As SystemType = aGetType(Class獲得Class的Type
  Dim obj As Object = ActivatorCreateInstance(myType) 獲得Class的實例

  Classvb原文件

以下是引用片段
  Public Class ClassClass Class
  Public i As Integer
  End Class


From:http://tw.wingwit.com/Article/program/net/201311/15309.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.