2010-05-17 49 views
2

當我動態加載程序集,然後從它調用一個方法時,我似乎從調用它的方法中的代碼之前獲取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 

回答

0

日期時間並不像您想象的那麼精確,您可能會看到這種不完美。

+0

在實際的代碼中,我試圖從文件中讀取值。我更新調用方法中的值,然後在Assembly方法中讀取它。 Assembly方法正在從文件中提取前一個值。當我通過Assembly類查看文件上的編輯時間戳時,我發現它沒有被調用方法更新。 – 2010-05-17 21:04:43

0

所以你寫新的時間回到文件,然後重新讀它?你是否正在刷新輸出流,以確保數據已寫入文件,而不僅僅是緩存用於懶惰寫入?

+0

查看上面的更多輸出。 – 2010-05-18 12:01:35

+0

這兩種方法是否同時打開文件? – 2010-05-18 17:41:49

+0

我不這麼認爲。在保存文件的方法退出之前,有一個StreamReader.Close()調用來關閉文件。然後,在組裝方法開始之前,方法返回後有5秒的睡眠時間。在組裝方法開始時,還有5秒的睡眠時間。這兩個睡眠都通過System.Threading.Thread.Sleep()調用完成。我認爲這可能是一個多線程問題,但睡眠似乎沒有同步代碼。這可能是我正在加載程序集的上下文的問題嗎? – 2010-05-19 11:01:27