Проблема может быть разбита на поиск перехватчиков, которые срабатывают до и после Main
выполнения метода консольного приложения.
Первая ловушка - это статический конструктор Program
, который является гарантия выполнения раньше Main
метода в Program
классе.
Во-вторых, событие ProcessExit для AppDomain
, которое «Происходит при выходе из родительского процесса домена приложения по умолчанию». Вы можете использовать статический конструктор, чтобы подписаться на это событие.
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");
}
}
печатает:
line no 1
line no 2
line no 3
Следующая часть будет довольно длинной. Постараюсь объяснить, в чем проблема с SomeAttribute
в вашем вопросе.
Прежде всего рассмотрите этот вопрос StackOverflow, чтобы точно знать , когда выполняются конструкторы настраиваемых атрибутов < / а>. Это не так просто, как может показаться на первый взгляд.
Как мы уже знаем, ctor настраиваемого атрибута будет выполняться только тогда, когда вы получите к нему доступ через отражение. Итак, в вашем примере выполнение простой программы не запускает конструктор атрибутов. Но почему срабатывает ваша точка останова, когда вы применяете метод SomeAttribute
к Main
? Оказывается, Visual Studio использует рефлексию, чтобы узнать основной метод и прикрепить отладчик к вашему приложению. Но в этот момент окна консоли нет. Таким образом, утверждение Console.WriteLine
бесполезно и производит эффект. Более того, кажется, что он блокирует все последующие операторы вывода на консоль.
Итак, следующий код будет давать разные результаты, в зависимости от того, запускаете ли вы его с отладчиком VS или нет:
class Program
{
[MyAttribute]
static void Main()
{
}
}
class MyAttribute : Attribute
{
public MyAttribute()
{
MessageBox.Show("MyAttribute ctor");
}
}
Если вы запустите его без отладчика (Ctrl + F5 в конфигурации VS по умолчанию), вы увидите, что программа завершает работу и окна не появляются. Когда вы запустите его с помощью отладчика (F5), вы увидите
![введите описание изображения здесь](https://i.stack.imgur.com/nl0fh.png)
и нет окна консоли рядом с VS, только значок формы выигрыша: ![введите описание изображения здесь](https://i.stack.imgur.com/c2mSa.png)
Как я описывал ранее, когда вы пытаетесь писать в консоль, когда никого нет, все остальные вызовы Console.WriteLine
не влияют на ваше консольное приложение. Вот почему вы можете видеть любые сообщения консоли, даже если вы установили точку останова в конструкторе.
person
Ilya Ivanov
schedule
13.04.2013
Without changing a main method which reads
... правда?!? - person Mike Perrenoud   schedule 13.04.2013