Sie sind Problem sein kann Aufgegliedert in die Suche nach den Hooks, die vor und nach Main
Methodenausführung der Konsolenanwendung ausgelöst werden.
erster Haken ist ein Program
statischer Konstruktor, die guarantee ist vorMain
Methode in Program
Klasse auszuführen.
Zweitens ist ein Ereignis ProcessExit ein AppDomain
, die „Tritt ein, wenn die übergeordneten Prozess beendet der Standardanwendungsdomäne“. Sie können den statischen Konstruktor verwenden, um dieses Ereignis zu abonnieren.
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");
}
}
druckt:
line no 1
line no 2
line no 3
Nächster Teil wäre ein ziemlich lang. Ich werde versuchen, zu erklären, was das Problem mit SomeAttribute
in Ihrer Frage ist.
Betrachten Sie zuerst diese StackOverflow-Frage genau when custom attributes constructors are executed. Dies ist nicht so einfach, wie es auf den ersten Blick scheinen mag.
Wie wir bereits wissen, wird ctor des benutzerdefinierten Attributs nur ausgeführt, wenn Sie über Reflektion darauf zugreifen. In Ihrem Beispiel löst die einfache Programmausführung keinen Attributkonstruktor aus.Aber warum trifft Ihr Breakpoint, wenn Sie die Methode SomeAttribute
auf Main
anwenden? Es stellt sich heraus, dass Visual Studio Reflexionen verwendet, um die Hauptmethode herauszufinden und einen Debugger an Ihre Anwendung anzuhängen. Aber an diesem Punkt gibt es kein Konsolenfenster. So ist die Aussage nutzlos und produziert zu wirken. Darüber hinaus scheint es alle folgenden Anweisungen für die Konsolenausgabe zu blockieren.
So wird im nächsten Code zu unterschiedlichen Ergebnissen führen, je nachdem, ob Sie es mit VS-Debugger ausführen oder nicht:
class Program
{
[MyAttribute]
static void Main()
{
}
}
class MyAttribute : Attribute
{
public MyAttribute()
{
MessageBox.Show("MyAttribute ctor");
}
}
Wenn Sie es ohne Debugger (Ctrl + F5 in VS Standardkonfiguration) laufen, Sie werden sehen, dass das Programm beendet wird und keine Fenster erscheinen. Wenn Sie es mit Debugger ausführen (F5) Sie werden sehen,
und kein Konsolenfenster neben VS, nur Formen Symbol gewinnen:
Wie ich bereits beschrieben habe, Wenn Sie versuchen, in die Konsole zu schreiben, wenn niemand da ist, haben alle anderen Aufrufe von keinen Einfluss auf Ihre Konsolenanwendung. Aus diesem Grund können Sie alle Konsolennachrichten anzeigen, auch wenn Sie im Konstruktor einen Haltepunkt setzen.
'Ohne eine Hauptmethode zu ändern, die liest' ... wirklich?!? –
@MichaelPerrenoud: Ich bin mir ziemlich sicher, dass dies eine Übung ist, die etwas cleveres Denken braucht. Ich denke wirklich, dass es ziemlich interessant ist. –
@ArnoSluismans, das ist in Ordnung. Und es ist wirklich einfach, es war einfach wirklich komisch. Aber danke, dass du mich auf den richtigen Weg gebracht hast, schau dir meine Antwort an. –