Pourquoi ce constructeur statique n'est pas appelé?
Je suis de la création asp.net service web. J'ai une classe dont le constructeur statique n'est pas appelé quand j'essaie d'initialiser un objet de cette classe. Je ne suis pas en mesure de comprendre ce comportement. À l'intérieur de constructeur statique, je suis à la lecture de valeurs à partir du web.fichier de configuration.
Voici la partie de code :
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
AppController extractor;
public Service()
{
try
{
extractor = new AppController();
}
catch(Exception ex)
{
//I am not getting exception at this point.
}
}
}
public class AppController
{
static string converterBatchFilePath = null;
static string personalProfileOutputFolderPath = null;
static AppController()
{
//reading some settings from web.config file
try
{
converterBatchFilePath = ConfigurationManager.AppSettings["WordToTextConverterBatFilePath"];
}
catch(Exception ex)
{ //}
}
public AppController()
{
//do some initialization
}
}
Pendant le débogage web service, j'ai remarqué que seul le constructeur est appelé et le contrôle ne va jamais à un constructeur statique.
Ce que quelqu'un sait pourquoi ce qui se passe?
Je suis avec VS 2008 Express edition et C#.
MODIFIER
En fait, ce AppController est basé console projet. J'ai ajouté ce projet comme une référence à l'intérieur du projet de service Web et ensuite de l'utiliser. Si j'utilise AppController en ligne de commande, il fonctionne très bien, mais sa ne fonctionne pas à partir de l'intérieur du projet de service web.
Très étrange. Êtes-vous sûr que ce n'est pas votre test qui est défectueux?
Fonctionne très bien pour moi, le constructeur statique est appelé dans un exemple simple. Si le comportement observable du constructeur de ne pas être considéré est quelque chose à voir avec la config, je suppose que l'erreur est avec la config des trucs à la place.
Il y a private static string type de variables dans la classe AppController. Cela se produit parce que j'ai initialisé ceux variable à null au moment de la déclaration?
Un truc que j'aimerais essayer est (temporairement) de mettre le contenu de
static AppController
dans un try...catch et de les afficher/enregistrer l'exception.OriginalL'auteur Shekhar | 2011-09-13
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est qu'il est appelé avant de vous attendre à être appelé. Si vous avez déjà réglé votre site, mais pas recyclé le pool d'applications, il est très probable que le constructeur statique a déjà été exécuté.
De même tout ce qui accède à tous les membres statiques également appeler le constructeur statique si elle n'a pas déjà été appelé.
le comportement des variables statiques par rapport au domaine d'application et les processus les plus accusé dans IIS, IIS peut recycler les processus à chaque fois, la signification des variables statiques sont recyclés.
comment faire le recyclage des processus d'affecter les variables statiques? Savez-vous tout matériel de lecture/livre/blog où je peux obtenir plus d'informations à ce sujet?
il semble être lié à juste domaines d'application: bytes.com/topic/c-sharp/answers/...
Quatre ans plus tard, aider les personnes souffrant de cette réponse.
OriginalL'auteur Rune FS
Aujourd'hui, mon initialiseur statique n'a pas été appelé. Il s'avère initialiseurs statiques sont pas appelé avant d'accéder const membres d'une classe.
Depuis const valeurs sont connues au moment de la compilation, ce qui a du sens, mais cela signifie que la documentation qui stipule que "Il est appelé automatiquement avant ... tous les membres statiques sont référencés" est techniquement incorrect, au moins lorsqu'il est combiné avec @JonSkeet de l'affirmation de que "Toutes les constantes déclarations sont implicitement statique".
Ce programme illustre le problème:
La sortie est:
Constante=1
Problème: l'initialiseur statique
ReadOnly=2
Champ=3
Property=4
(Testé contre .NET 4.5.)
OriginalL'auteur yoyo
Un constructeur statique est utilisé pour initialiser les données statiques, ou pour effectuer une action spécifique que les besoins effectuée qu'une seule fois. Elle est appelée automatiquement avant la première instance est créée ou tous les membres statiques sont référencés.
Veuillez noter que
un constructeur statique est automatiquement appelée pour initialiser la classe avant la première instance est créée ou tous les membres statiques sont référencés. et l'utilisateur n'a aucun contrôle sur quand le constructeur statique est exécutée dans le programme.
Prises de MSDN de Constructeurs Statiques (Guide de Programmation C#) .
Cela montre juste qu'il devrait être appelé(Depuis une instance a été créée le constructeur statique est la garantie d'avoir exécuté), mais n'explique pas le comportement de l'OP observe.
Pour être honnête, je pense que l'implication sous-jacente est que l'OP n'a pas diagnostiqué le problème correctement.
Je suis d'accord que l'utilisateur n'a aucun contrôle sur quand le constructeur statique s'est exécuté, mais normalement quand je déboguer un programme à l'aide de Visual Studio et de mettre debug point à l'intérieur de constructeur statique, l'exécution s'arrête sur cette ligne et je suis en mesure de déboguer le code de l'intérieur que le constructeur statique. Ce n'est pas le cas maintenant.
un certain nombre de choses peuvent arrêter des points d'arrêt d'être frappé, comme certains de débogage attributs disponibles, ou VS paramètres. J'ai créé un projet vide avec rien dans les constructeurs et mon constructeur statique est appelé OK, C# 4, .Net 4, VS 2010.
OriginalL'auteur Sandeep Pathak
Je pensez que votre problème est causé par une exception soulevée dans votre constructeur statique et d'être avalé par le code qui crée l'instance.
Peut-être même une exception dans un champ statique de l'initialiseur qui sont encore plus difficiles à déboguer.
Peut-être se brisent sur les exceptions de première chance permet de déboguer le problème.
Je ne voudrais pas mettre le code qui lit un fichier de configuration dans un constructeur statique. Je serais plutôt d'encapsuler toutes les config dépendante des trucs que vous avez dans une classe et de passer une instance de cette classe dans votre constructeur, probablement à l'aide d'un conteneur IoC.
Cela a un certain nombre d'avantages:
(Je sais que ce n'est pas une réponse, mais c'est trop long pour un commentaire)
OriginalL'auteur CodesInChaos
Voici un petit exemple, j'ai mis ensemble pour obtenir les valeurs à partir d'un fichier de configuration dans votre extracteur de classe, à la fois statique et constructeurs d'instances. Cela fonctionne pour moi-de le comparer à ce que vous êtes en train de faire et voir ce qui est différent:
De mon site web.config:
Ma réponse:
OriginalL'auteur David Hoerster