VB .Net - Reflection: отраженный метод из загруженной сборки выполняется перед вызовом метода. Зачем? - PullRequest
2 голосов
/ 18 мая 2010

Когда я загружаю сборку динамически, а затем вызываю из нее метод, я, кажется, получаю метод из сборки, выполняющийся перед кодом в вызывающем ее методе. Похоже, он не выполняется в последовательном порядке, как я ожидал. Может кто-нибудь пролить свет на то, почему это может происходить. Ниже приведен код для иллюстрации того, что я вижу, код из сборки 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  

Ответы [ 2 ]

0 голосов
/ 18 мая 2010

То есть вы записываете новое время обратно в файл, а затем перечитываете его? Вы очищаете поток вывода, чтобы гарантировать, что данные были записаны в файл, а не просто кэшированы для отложенной записи?

0 голосов
/ 18 мая 2010

Дата и время не так точны, как вы думаете, возможно, вы просто видите это несовершенство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...