Comment diagnostiquer l'erreur SEHException - composant Externe a jeté une exception
chaque fois qu'un utilisateur signale une erreur telle que
du Système.Runtime.InteropServices.SEHException - composant externe a lancé une exception?
y a-t-il quelque chose que je puisse faire en tant que programmeur pour déterminer la cause?
scénario: un utilisateur (utilisant un programme que mon entreprise a écrit) a signalé cette erreur. Cela peut ou peut ne pas avoir été une erreur. Ils mentionné qu'au cours du dernier mois, l'ordinateur a deux fois "cessé de fonctionner". J'ai appris de l'expérience, de ne pas prendre cette description trop littéralement, il signifie généralement que quelqu'un se rapportant à l'ordinateur ne fonctionne pas comme prévu. Ils n'ont pas pu me donner plus de détails et je n'ai trouvé aucune erreur enregistrée. Il se peut donc qu'il s'agisse ou non de cette erreur.
de la pile-trace, l'erreur réelle a été lors de la construction d'une classe qui n'appelle pas directement code interop, mais peut-être compliqué par le fait que l'objet peut faire partie d'une liste qui est basée sur une grille DevExpress.
l'erreur a été 'attrapée' par une routine d'exception non manipulée qui normalement fermera le programme, mais a une option d'ignorer et de continuer. S'ils ont choisi d'ignorer l'erreur, alors le programme a continué à fonctionner mais l'erreur est réapparue lorsque cette routine a été lancée. Cependant, il ne s'est pas produit à nouveau après la fermeture et le redémarrage de notre application.
l'ordinateur en question ne semblait pas stressé. Il est en cours D'exécution Vista Business, a 2 Go de mémoire et selon le Gestionnaire des tâches n'a utilisé qu'environ la moitié de celle-ci avec notre application à peu près 200 Mo.
il y a une autre information qui peut être pertinente ou non. Une autre section du même programme utilise un composant tiers qui est en fait un enveloppeur dotnet autour d'une dll native et ce composant ne ont un problème connu très occasionnellement, vous obtenez un
tentait de lire ou d'écrire de la mémoire protégée. C'est souvent une indication que d'autres mémoires sont corrompues
Le composant décideurs dire que cela a été corrigé dans la dernière version de leurs composants que nous utilisons en interne, mais cela n'a pas été donné pour le client.
étant Donné que les conséquences de l'erreur sont faibles (pas de travaux perdu et redémarrer le programme et de revenir à l'endroit où ils étaient ne prend qu'une minute au plus) et étant donné que le client va bientôt obtenir une nouvelle version (avec le composant tiers mis à jour), je peux évidemment croiser les doigts et espérer que l'erreur ne se reproduira pas.
mais puis-je faire autre chose?
7 réponses
Oui. Cette erreur est une exception structurée qui n'a pas été mappée dans une erreur .NET. C'est probablement votre mapping de DataGrid qui a lancé une exception native qui n'a pas été récupérée.
vous pouvez dire quelle exception se produit en regardant l'exception externe .ErrorCode propriété. Je vérifierais la trace de votre pile, et si elle est liée à la grille DevExpress, signalez-leur le problème.
j'ai eu un problème similaire avec une SEHException qui a été lancée quand mon programme a utilisé pour la première fois une dll enveloppante native. Il s'est avéré que la DLL native pour ce papier avait disparu. L'exception n'a en rien aidé à résoudre ce problème. Ce qui a aidé en fin de compte était d'exécuter procmon en arrière-plan et de vérifier s'il y avait des erreurs lors du chargement de tous les DLLs nécessaires.
si vous avez un problème comme décrit dans ce post:
asp.net MVC debugger throwing SEHException
alors la solution est:
si vous avez une application de Trusteer (comme rapport ou autre ) juste désinstaller et redémarrer votre système, il fonctionnera très bien ... trouvé cette solution ici:
http://forums.asp.net/t/1704958.aspx/8/10?Re+SEHException+levée+quand+je+run+à la demande+
Le composant décideurs dire que cela a été corrigé dans la dernière version de leurs composants que nous utilisons en interne, mais cela a été donné pour le client.
demander au fabricant de composants Comment tester si le problème que le client obtient est le problème qu'ils disent avoir corrigé dans leur dernière version, sans/Avant de déployer leur dernière version au client.
une vieille question, mais pour les googleurs: j'ai rencontré cette erreur lorsque l'application réside sur un partage de réseau, et l'appareil (ordinateur portable, tablette, ...) est déconnecté du réseau pendant que l'application est utilisée. Dans mon cas, c'était dû à une tablette Surface de sortir de portée sans fil. Aucun problème après l'installation d'une meilleure WAP.
juste une autre information... Avait ce problème aujourd'hui sur un système Windows 2012 x64 TS où l'application a été commencé à partir d'un chemin unc/réseau. Le problème s'est posé pour une application pour tous les utilisateurs du serveur de terminal. L'exécution de l'application sur place a fonctionné sans problème. Après un redémarrage, il a recommencé à fonctionner - la SEHException lancée avait été INIT constructeur et TargetInvocationException
configuration de ma machine:
système D'exploitation: Windows 10 Version 1703 (x64)
j'ai affronté cette erreur en déboguant mon projet C# .Net dans Visual Studio 2017 Community edition. J'appelais une méthode native en exécutant P / invoke sur un assemblage C++ chargé à l'exécution. J'ai rencontré la même erreur rapportée par L'OP.
J'ai réalisé que Visual Studio a été lancé avec un compte d'utilisateur qui n'était pas un administrateur sur la machine. Puis J'ai relancé Visual Studio sous un autre compte d'utilisateur qui était un administrateur sur la machine. C'est tout. Mon problème a été résolu et je n'ai pas fait face à la question à nouveau.
une chose à noter est que la méthode qui était invoquée sur C++ assembly était censée écrire peu de choses dans le registre. Je ne suis pas allé déboguer le code C++ pour faire quelque RCA, mais je vois une possibilité que tout cela ait échoué car les privilèges administratifs sont requis pour écrire le Registre dans le système D'exploitation Windows 10. Donc plus tôt, quand Visual Studio fonctionnait sous un compte d'utilisateur qui n'avait pas de privilèges administratifs sur la machine, les appels natifs échouaient.