Dim u As UInteger = 0
Try
Do
u += 1
j = DirectCast(o.item(d), HTMLTableRow).cells
Loop
Catch ex As Exception
MsgBox("Access No." & u & " throws:" & ex.GetType.ToString & ":" & ex.Message)
End Try
Ceci est le morceau de code I utilisé comme test - une boucle morte, l'accès à l'infini O variable (affectées code avant) et l'affecter à la variable J avec une opération (O et J sont tous les deux le type MSHTML.IHTMLElementCollection). En mode débogage, je peux l'exécuter normalement jusqu'à ce que le compteur atteigne sa limite supérieure. Cependant, sous le mode de libération, après la boucle pour 5000 ~ 6000 fois (dans chaque test, le nombre est différent), il lancera "NullReferenceException". Notez que je viens d'accéder à O, je ne l'ai jamais changé, pourquoi est-ce l'exception? Est-ce un bug de MSHTML l'assemblée? De plus, si je fais un changement mineur:bug étrange à l'Assemblée MSHTML
Dim u As UInteger = 0, v As Object
Try
Do
u += 1
v = DirectCast(o.item(d), HTMLTableRow)
Loop
Catch ex As Exception
MsgBox("Access No." & u & "throws:" & ex.GetType.ToString & ":" & ex.Message)
End Try
C'est, pour enlever les « .cells », et il n'y aura pas d'exceptions. Que se passe t-il ici? (Cela ne peut pas être utilisé comme une solution de contournement car le programme ".cells" doit être accédé) Si j'utilise TryCatch block pour ignorer l'exception et réessayer, il ne fonctionnera plus normalement - en levant l'exception pour chaque boucle. Il doit y avoir des changements qualitatifs.
Si cela fonctionne en mode débogage, mais échoue en mode de publication, je suppose que le compilateur optimise votre code de manière à ce qu'il casse. J'utiliserais une décompilation prise, comme dotPeek, pour regarder le code d'optimisation généré. – Icemanind
@Icemanind Merci, mais je préfère abandonner mon projet si je dois apprendre l'ASM juste pour le débogage. Des conseils tangibles? –
MSHTML ne peut pas avoir de bogue, il ne contient aucun code. C'est juste un assembly interop pour accéder au DOM d'un navigateur web. Tout et n'importe quoi peut se produire dans un navigateur Web, vous accédez à des éléments DOM avec lesquels le Javascript d'une page Web peut aussi être en train de jouer. Oui, mieux vaut abandonner. –