Когда я загружаю сборку динамически, а затем вызываю из нее метод, я, кажется, получаю метод из сборки, выполняющийся перед кодом в вызывающем ее методе. Похоже, он не выполняется в последовательном порядке, как я ожидал. Может кто-нибудь пролить свет на то, почему это может происходить. Ниже приведен код для иллюстрации того, что я вижу, код из сборки some.dll вызывает метод с именем PerformLookup. Для тестирования я поместил аналогичный вывод типа MessageBox с текстом «PerformLookup Time:» в качестве текста. В итоге я вижу:
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
Я добавил оператор flush в конец моего метода записи, хотя у меня был вызов 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