2010-11-22 3 views
3

Est-ce que quelqu'un sait pourquoi le constructeur d'un attribut décrivant la méthode principale est appelé dans les versions de débogage, mais pas dans les versions de version?
Comment puis-je m'assurer que le constructeur est également appelé dans les versions release? Sans l'appeler manuellement bien sûr.Le constructeur de l'attribut décrivant la méthode principale n'est pas appelé dans les versions de version

Toute idée sur ce sujet serait très appréciée.

+0

Et comment avez-vous exactement arriver à cette conclusion? Et s'il vous plaît ne me dites pas que vous avez essayé de déboguer quand l'optimisation est sur – leppie

+0

Sans code, il est impossible de penser à quelque chose, s'il vous plaît poster quelque chose à manger :) – TalentTuner

+0

@leppie - il n'y a rien de mal à sa conclusion –

Répondre

2

Je peux reproduire ceci (à la fois de débogage et de publication), lorsqu'il est exécuté via l'IDE avec l'option "Debug" => "Activer le processus d'hébergement Visual Studio" activé, via le ci-dessous. Sur la ligne de commande, il affichera "bonjour", où, via l'EDI, il affichera "monde". Il semble que l'EDI fasse une réflexion différente sur les attributs.

Ceci est pas comportement attendu, et vous ne devriez pas compter sur ce comportement. Si vous voulez exécuter un code particulier: appelez le code désiré explicitement. Pour obtenir un comportement prévisible, désactivez le débogage »=> « Activer l'option de processus d'hébergement Visual Studio ».

using System; 
public class MyTestAttribute : Attribute { 
    public MyTestAttribute() { 
     Program.text = "world"; 
    } 
} 
class Program { 
    public static string text = "hello"; 
    [MyTest] 
    static void Main() { 
     Console.WriteLine(text); 
     Console.ReadKey(); 
    } 
} 
+0

Je ne savais pas que ce comportement n'était pas attendu, puisque l'attribut STAThread décore aussi la méthode principale Merci pour votre confirmation Repenser le design ...;) – NullAndVoid

+1

@NullAndVoid - attributes are gen erally * marqueurs * plutôt que prévu de prendre un jet actif. Je * attend * c'est en fait 'STAThread' qu'il cherche, mais où - comme le CLR de base pourrait vérifier avec' Attribute.IsDefined', peut-être que le processus hôte VS appelle 'GetAttributes' (qui force la matérialisation) et * * Filtrage pour voir si '[STAThread]' était dedans. –

Questions connexes