2010-10-02 8 views
0

Comment arrêter un constructeur statique (constructeur de module & constructeur de type) de s'exécuter dans .NET?Arrêter le constructeur statique

Par exemple:

class A 
{ 
    static A() 
    { 
     Environment.Exit(0); 
    } 
    static int i() 
    { 
     return 100; 
    } 
} 

Comment invoquer i() sans quitter? Comment faire pour empêcher un constructeur statique de s'exécuter dans .NET?

+10

//Environment.Exit(0); :) – kofucii

+0

@kofucii: LOL pour le "commentaire". –

Répondre

1

En fait, je fais un interprète de .net,

Si vous utilisez

System.Reflection.Assembly.ReflectionOnlyLoadFrom(fileName); 

Le cteur statique ne fonctionne pas.

+0

Oui, je sais que le constructeur statique ne fonctionnera pas Reflet seul contexte, mais je ne serai pas en mesure de créer des objets de type dans l'assemblage aussi. – Kii

+0

@Kii, et la sécurité de type dotNET indique que vous ne pouvez pas créer d'objets sans exécuter les cteurs statiques associés. –

+0

oui, donc je vais casser la sécurité de type :) – Kii

5

Vous ne pouvez pas faire cela. Static constructor sera appelée avant qu'une instance du type soit créée ou qu'un membre statique soit référencé. C'est appelé par le CLR et vous n'avez absolument aucun contrôle sur le moment exact. La seule façon d'éviter d'appeler le constructeur statique est de ne jamais référencer et d'utiliser le type qui contient ce constructeur statique. Pourquoi définiriez-vous un constructeur statique en premier lieu si vous ne voulez pas qu'il soit exécuté? Mettre une instruction Environment.Exit(0) dans un constructeur statique, c'est comme prendre une arme et vous tirer dans la jambe.

+0

Je veux charger un assembly qui a un constructeur statique qui l'empêche d'être chargé par d'autres programmes. De plus, je vois des codes dans SSCLI qui sont contrôlés par un drapeau ClassInit, donc je pensais qu'il devrait y avoir un moyen bizarre de l'arrêter. – Kii

+0

Les assemblys n'ont pas de constructeur statique. Les types font. –

+0

il ya constructeur de module et je pense que cela devrait être statique – Kii

1

Comme d'autres l'ont mentionné, si vous chargez le type, le constructeur statique s'exécutera. Il n'y a pas moyen de contourner cela.

Vous pouvez utiliser Cecil ou MS CCI. Les deux vous permettent d'inspecter un type sans le charger. Vous pouvez créer un type dynamique en clonant la classe A, supprimer le constructeur statique et enfin créer le type modifié.