2010-11-15 19 views
11

Existe-t-il un moyen en C# ou .net IL de forcer une classe qui a un initialiseur de type (constructeur statique) à se charger, sans accéder à aucun de ses paramètres?Forcer le chargement de la classe

En supposant que j'ai la classe

public static class LogInitialization { 
    static LogInitialization() { 
     System.Console.WriteLine("Initialized"); 
    } 
} 

Y at-il un moyen d'obtenir cette ligne à imprimer?

Notez que la classe est statique, donc je ne peux pas l'instancier pour forcer l'initialisation, et elle n'a aucun membre public, donc je ne peux pas y accéder pour la démarrer.

Répondre

12

Fouillant dans la spécification CLI, je trouve une référence à la méthode RuntimeHelpers.RunClassConstructor

Si une langue souhaite fournir un comportement plus rigide - par exemple, l'initialisation de type déclenche automatiquement l'exécution des initialiseurs de classe de base, dans une partie supérieure pour -À-bas - il peut le faire soit:

  • définissant les champs statiques cachés et le code dans chaque constructeur de classe qui touche le champ statique caché de sa classe de base et/ou interfaces qu'il implémente, ou 01 En faisant des appels explicites à System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor (voir Partition IV).
+2

Pour l'utiliser, passez le résultat de la propriété 'TypeHandle' sur votre instance de' Type'. – Sam

7

Je crée généralement une méthode Init fictive sur des classes avec des constructeurs statiques pour forcer l'exécution du constructeur statique. c'est à dire.

public static void Initialize() 
{ 
    // this will force your static constructor to execute, obviously 
} 

Cela dit, vous pouvez toujours aller pour la Type.TypeInitializer avec la réflexion ... http://msdn.microsoft.com/en-us/library/system.type.typeinitializer.aspx

EDIT: Une autre chose que je l'ai fait dans le passé, est de créer un attribut appelé alors RequiresInitializationAttribute sur AssemblyLoad analyse l'assembly pour les types avec un tel attribut et en utilisant le type.TypeInitializer pour forcer le constructeur statique à exécuter lorsque l'assembly conteneur est chargé.

Je suppose que la vraie question, comme d'habitude, est ... qu'est-ce que vous essayez d'accomplir?

+0

Oui, je pouvais appeler le 'me .cctor' - je n'étais pas sûr si cela empêcherait le CLR d'appeler à nouveau. – configurator

+0

En outre, l'appel de l'initialiseur de type sur les types statiques échoue! "Impossible de créer une instance de A car il s'agit d'une classe abstraite." Je ne vois pas pourquoi ce message est lié, mais c'est ce que je reçois. – configurator

+0

Quant à ce que j'essaie d'accomplir, je compile essentiellement à partir d'un langage qui a des règles strictes sur le moment où les classes doivent être chargées - donc je veux les charger au bon moment. – configurator