Non Sei problema può essere suddiviso nella ricerca dei ganci, che vengono attivati prima e dopo l'esecuzione del metodo Main
dell'applicazione console.
primo gancio è un costruttore statico Program
, che è guarantee eseguire primaMain
metodo Program
classe.
In secondo luogo è un evento ProcessExit di un AppDomain
, che "si verifica quando le uscite di processo genitore del dominio applicazione predefinita". È possibile utilizzare il costruttore statico per iscriversi a questo evento.
class Program
{
static Program()
{
Console.WriteLine("line no 1");
AppDomain.CurrentDomain.ProcessExit +=
(s, a) => Console.WriteLine("line no 3");
}
static void Main(string[] args)
{
Console.WriteLine("line no 2");
}
}
stampe:
line no 1
line no 2
line no 3
parte successiva sarebbe abbastanza lunga. Proverò a spiegare qual è il problema con SomeAttribute
nella tua domanda.
Prima di tutto, considera questa domanda StackOverflow per sapere esattamente when custom attributes constructors are executed. Non è così semplice, come potrebbe sembrare a prima vista.
Come già sappiamo, il certificato dell'attributo personalizzato verrà eseguito solo quando sarà possibile accedervi tramite riflessione. Quindi nell'esempio semplice esecuzione del programma non si innesca costruttore di attributi.Ma perché viene colpito il punto di interruzione quando si applica il metodo SomeAttribute
a Main
? Si scopre che lo studio visivo usa la riflessione per scoprire il metodo principale e allegare un debugger alla tua applicazione. Ma non c'è nessuna finestra della console in quel punto. Quindi l'affermazione Console.WriteLine
è inutile e produce effetti. Inoltre, sembra bloccare tutte le prossime istruzioni sull'output della console.
Così la prossima codice produrrà risultati diversi, a seconda se lo si esegue con VS debugger o no:
class Program
{
[MyAttribute]
static void Main()
{
}
}
class MyAttribute : Attribute
{
public MyAttribute()
{
MessageBox.Show("MyAttribute ctor");
}
}
Se lo si esegue senza debugger (Ctrl + F5 nella configurazione di default VS), vedrai, quel programma termina e non appare nessuna finestra. Quando si esegue con il debugger (F5) vedrete

e nessuna finestra della console accanto al VS, vince solo forme icona: 
Come ho descritto in precedenza, quando si tenta di scrivere sulla console quando non c'è nessuno, tutte le altre chiamate a Console.WriteLine
non influiscono sull'applicazione della console. Ecco perché è possibile visualizzare tutti i messaggi della console, anche se si esegue un punto di interruzione nel costruttore.
'Senza cambiare un metodo principale che legge' ... davvero?!? –
@MichaelPerrenoud: Sono abbastanza sicuro che questo è un esercizio che dovrebbe prendere un pensiero intelligente. Onestamente penso che sia piuttosto interessante, infatti. –
@ArnoSluismans, va bene. Ed è davvero semplice, è stato davvero strano. Ma grazie per avermi indirizzato sulla strada giusta, dare un'occhiata alla mia risposta. –