7
votes

Suivi de l'exécution du constructeur statique

Je rencontre un problème ici où un constructeur statique d'une de mes classes est appelé avant de pouvoir être. (C'est-à-dire que di / ioc n'est pas configuré et que vous obtenez NULL / exceptions à partir du localisateur de services).

Je n'ai malheureusement pas beaucoup de contrôle sur le constructeur statique, ne me demandez pas pourquoi cela s'appuie sur DI / IOC à être mis en place, mais c'est.

Dans mon application, rien ne devrait faire référence à cette classe statique ou autrement avant que mon CIO soit prêt à partir, mais le constructeur statique exécute quand même.

Y a-t-il un moyen facile de déterminer quelle ligne a entraîné une exécution du constructeur? REMARQUE: Je ne peux pas rompre dans le constructeur car c'est tout ce qui se passe avant que le débogueur distant pour ASP.NET puisse connecter au serveur Web (dans global.asax.cs)


0 commentaires

5 Réponses :


19
votes

Comme toujours, utilisez: xxx


1 commentaires

@Aren: Vous pouvez toujours écrire un code dans le fichier global.asax ; p



1
votes

Vous n'avez aucun contrôle sur lorsque le constructeur statique est exécuté. Déplacez tout ce que vous faites de votre constructeur à une fonction statique initialisée () . Appelez celui-là chaque fois que vous êtes prêt. Ne dépendez pas du moment où le constructeur statique est exécuté.

Vérifiez ce lien < / p>

Les constructeurs statiques ont les suivants

Propriétés:

Un constructeur statique est appelé automatiquement pour initialiser la classe avant la création de la première instance ou des membres statiques sont référencés.

Un constructeur statique ne peut pas être appelé directement.

L'utilisateur n'a aucun contrôle lorsque le Le constructeur statique est exécuté dans le Programme.


2 commentaires

Oui, j'ai compris autant. Malheureusement, je traite du code que je n'ai pas écrit ici> _>


Oui, finalement, vous avez confirmé ce que je soupçonné. C'est à dire. Cette approche n'est vraiment pas la bonne. Je vais devoir voir quel effet de levier je dois changer la classe en question. Merci :)



3
votes

Cela pourrait être fait en utilisant WINDBG et SOSEX. Voici le code exemple xxx

et voici les étapes

  1. Joindre le processus à Windbg
  2. charge sosex à l'aide de .charger SOSEX
  3. Prochaine numéro suivant La commande ! mbm * CODE.TEST..CCTOR *
  4. Le débogueur rompt sur appel à la constructeur statique après lequel vous pourriez émettre ! MK pour obtenir le CallStack

    Voici la sortie de ! MK pour l'échantillon ci-dessus xxx

    hth


0 commentaires

0
votes

Peut-être que vous devriez passer à l'aide de constructeur statique? Est-ce nécessairement? xxx


0 commentaires

2
votes

Ci-dessous est mon expérience de débogage de constructeur statique,

Quand j'essayais de déboguer en plaçant un point d'arrêt sur la ligne où le champ statique avait référencé, je ne recevais pas de contrôle de débogage sur le constructeur statique.

Je n'ai gardé l'arrêt d'arrêt sur l'entrée du constructeur statique, supprimé le point d'arrêt de la ligne où le champ statique avait référencé . Maintenant, le contrôle de débogage a commencé à entrer dans le code du constructeur statique.

Cette image indique comment votre éditeur avec points d'arrêt ressemblerait à


2 commentaires

+1 Cela a fonctionné pour moi (apparemment le point d'arrêt doit être sur le support d'ouverture du constructeur ... Cela est vrai même lorsque le constructeur n'est pas statique, mais vous l'avez fait privé afin de mettre en œuvre le modèle Singleton).


Merci, cela aide.