當我動態加載程序集,然後從它調用一個方法時,我似乎從調用它的方法中的代碼之前獲取Assembly執行的方法。它並不像我所期望的那樣以串行方式執行。任何人都可以點亮一下爲什麼會發生這種情況。下面是一些代碼來說明我所看到的,來自some.dll程序集的代碼調用名爲PerformLookup的方法。對於測試,我將類似的MessageBox類型輸出與「PerformLookup Time:」作爲文本。我最終看到的是:VB .Net - 反射:在調用方法之前,從加載的程序集反射的方法執行。爲什麼?
First: "PerformLookup Time: 40:842"
Second: "initIndex Time: 45:873"
Imports System
Imports System.Data
Imports System.IO
Imports Microsoft.VisualBasic.Strings
Imports System.Reflection
Public Class Class1
Public Function initIndex(indexTable as System.Collections.Hashtable) As System.Data.DataSet
Dim writeCode As String
MessageBox.Show("initIndex Time: " & Date.Now.Second.ToString() & ":" & Date.Now.Millisecond.ToString())
System.Threading.Thread.Sleep(5000)
writeCode = RefreshList()
End Function
Public Function RefreshList() As String
Dim asm As System.Reflection.Assembly
Dim t As Type()
Dim ty As Type
Dim m As MethodInfo()
Dim mm As MethodInfo
Dim retString as String
retString = ""
Try
asm = System.Reflection.Assembly.LoadFrom("C:\Program Files\some.dll")
t = asm.GetTypes()
ty = asm.GetType(t(28).FullName) 'known class location
m = ty.GetMethods()
mm = ty.GetMethod("PerformLookup")
Dim o as Object
o = Activator.CreateInstance(ty)
Dim oo as Object()
retString = mm.Invoke(o,Nothing).ToString()
Catch Ex As Exception
End Try
return retString
End Function
End Class
我添加了一個沖洗聲明我寫方法的末尾,即使我有一個StreamReader.Close()調用。相同的結果。下面是我放入的一些調試語句的輸出,用於進一步嘗試和診斷它。在initIndex我
write(timestamp)
save(file)
write(save success)
write(saved value)
write(timestamp)
write(file create/file modified times)
sleep(5 seconds)
invoke(assembly method)
write(timestamp)
而在裝配方法,我有:
write(timestamp)
sleep(5 seconds) //yes, two 5 second sleeps between write and read
read(file)
write(file value)
write(timestamp)
write(file create/file write times)
這裏是initIndex日誌文件我的輸出:
17:732
True
A/P
17:732
5/17/2010 11:59:30 AM/5/18/2010 7:49:17 AM
22:748
這裏是從Assembly類輸出日誌文件:
12:670
CASH
17:685
5/17/2010 11:59:30 AM/5/18/2010 7:41:20 AM
在實際的代碼中,我試圖從文件中讀取值。我更新調用方法中的值,然後在Assembly方法中讀取它。 Assembly方法正在從文件中提取前一個值。當我通過Assembly類查看文件上的編輯時間戳時,我發現它沒有被調用方法更新。 – 2010-05-17 21:04:43