Lorsque je charge un assembly dynamiquement, puis que j'appelle une méthode, il semble que la méthode de Assembly soit exécutée avant le code dans la méthode qui l'appelle. Il ne semble pas s'exécuter de manière sérielle comme je m'y attendrais. Quelqu'un peut-il faire la lumière sur pourquoi cela pourrait se produire. Ci-dessous un code pour illustrer ce que je vois, le code de l'assembly some.dll appelle une méthode nommée PerformLookup. Pour tester, je mets une sortie de type MessageBox similaire avec "PerformLookup Time:" comme texte. Ce que je finis par voir est:VB .Net - Réflexion: méthode reflétée à partir d'une Assemblée chargée s'exécute avant d'appeler la méthode. Pourquoi?
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
J'ai ajouté une déclaration affleurant à la fin de ma méthode d'écriture même si j'avais un appel StreamReader.Close(). Mêmes résultats Voici quelques sorties des instructions de débogage que j'ai mises pour essayer de diagnostiquer cela plus avant. En initIndex je
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)
Et dans la méthode Assemblée je:
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)
Voici ma sortie de fichier journal initIndex:
17:732
True
A/P
17:732
5/17/2010 11:59:30 AM/5/18/2010 7:49:17 AM
22:748
Et est ici la sortie de la classe Assemblée fichier journal:
12:670
CASH
17:685
5/17/2010 11:59:30 AM/5/18/2010 7:41:20 AM
Dans le code actuel, j'essaie de lire une valeur dans un fichier. Je mets à jour la valeur dans la méthode appelante, puis la lit dans la méthode Assembly. La méthode Assembly extrait la valeur précédente du fichier. Lorsque je regarde l'horodatage d'édition sur le fichier via la classe Assembly, je vois qu'il n'a pas été mis à jour par la méthode appelante. –