用.net動態建立類的執行個體

來源:互聯網
上載者:User

用.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



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。