2010-05-17 5 views
2

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 

Répondre

0

Les dates ne sont pas aussi précises que vous le pensez, vous pourriez voir cette imperfection.

+0

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. –

0

Vous écrivez donc la nouvelle heure dans le fichier, puis vous la relisez? Est-ce que vous vidangez le flux de sortie pour vous assurer que les données ont été écrites dans le fichier et pas seulement mises en cache pour une écriture paresseuse?

+0

Voir plus de résultats ci-dessus. –

+0

Est-ce que les deux méthodes ont le fichier ouvert en même temps? –

+0

Je ne pense pas. Avant la méthode qui enregistre le fichier se termine, il existe un appel StreamReader.Close() pour fermer le fichier. Il y a ensuite une pause de 5 secondes après le retour de la méthode avant le début de la méthode d'assemblage. Et au début de la méthode d'assemblage il y a un autre 5 secondes de sommeil. Les deux sessions sont effectuées avec les appels System.Threading.Thread.Sleep(). J'ai pensé que cela pourrait être un problème multi-threading, mais le sommeil ne semble pas synchroniser le code non plus. Cela pourrait-il être un problème avec le contexte dans lequel je charge l'assemblage? –

Questions connexes