jesteś problem może być z podziałem na wyszukiwanie haków, które są wyzwalane przed i po wykonaniu metody Main
aplikacji konsoli.
Pierwszy hak jest Program
statyczny konstruktor, który jest guarantee wykonać przedMain
metoda Program
klasę.
drugie jest wydarzeniem ProcessExit z AppDomain
, który „Występuje, gdy wychodzi proces-rodzic domeny domyślnej aplikacji” . Możesz użyć konstruktora statycznego, aby zasubskrybować to wydarzenie.
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");
}
}
drukuje:
line no 1
line no 2
line no 3
następna część będzie dość długa. Spróbuję wyjaśnić, jaki jest problem z SomeAttribute
w twoim pytaniu.
Przede wszystkim rozważ to pytanie StackOverflow, aby dokładnie wiedzieć, when custom attributes constructors are executed. To nie jest takie proste, jak mogłoby się wydawać na pierwszy rzut oka.
Jak już wiemy, ctor niestandardowego atrybutu zostanie wykonany dopiero wtedy, gdy uzyskasz do niego dostęp za pomocą refleksji. Więc na przykład proste wykonanie programu nie wywoła konstruktora atrybutów.Ale dlaczego twój punkt przełomowy trafił, gdy zastosujesz metodę SomeAttribute
do Main
? Okazuje się, że studio wizualne używa refleksu, aby znaleźć główną metodę i dołączyć do aplikacji debugger. Ale w tym momencie nie ma okna konsoli. Tak więc oświadczenie Console.WriteLine
jest bezużyteczne i daje efekt. Co więcej, wydaje się, że wszystkie następne wyciągi są blokowane na wyjściu konsoli.
Więc następny kod będzie produkować różne wyniki, w zależności czy go uruchomić z VS debugger lub nie:
class Program
{
[MyAttribute]
static void Main()
{
}
}
class MyAttribute : Attribute
{
public MyAttribute()
{
MessageBox.Show("MyAttribute ctor");
}
}
Jeśli uruchomić go bez debuggera (Ctrl + F5 w domyślnej konfiguracji VS), zobaczysz, że program się kończy i nie pojawiają się żadne okna. Po uruchomieniu go z debuggera (F5) zobaczysz
i bez okna konsoli obok VS tylko wygrać formularzy ikony:
Jak już wspomniano wcześniej, podczas próby zapisu na konsolę, gdy nie ma nikogo, wszystkie pozostałe połączenia z numerem Console.WriteLine
nie mają wpływu na działanie aplikacji konsoli. Dlatego możesz zobaczyć wszystkie komunikaty konsoli, nawet jeśli w konstruktorze ustawisz punkt przerwania.
'Bez zmiany głównej metody, która brzmi:" naprawdę?!? "? –
@MichaelPerrenoud: Jestem pewien, że jest to ćwiczenie, które ma zająć pewne sprytne myślenie. Szczerze mówiąc uważam, że to naprawdę interesujące. –
@ArnoSluismans, w porządku. I to naprawdę proste, to było naprawdę dziwne. Ale dzięki za skierowanie mnie właściwą drogą, spójrz na moją odpowiedź. –