Main
問題は、コンソール アプリケーションのメソッド実行の前後にトリガーされるフックの検索に分解できます。
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 はリフレクションを使用して main メソッドを見つけ、デバッガーをアプリケーションにアタッチします。しかし、その時点ではコンソール ウィンドウはありません。したがって、ステートメントConsole.WriteLine
は役に立たず、効果をもたらします。さらに、コンソール出力へのすべての次のステートメントをブロックしているようです。
したがって、次のコードは、VS デバッガーで実行するかどうかに応じて、異なる結果を生成します。
class Program
{
[MyAttribute]
static void Main()
{
}
}
class MyAttribute : Attribute
{
public MyAttribute()
{
MessageBox.Show("MyAttribute ctor");
}
}
デバッガーなしで実行すると ( VS の既定の構成ではCtrl + F5 )、そのプログラムが終了し、ウィンドウが表示されないことがわかります。デバッガー ( F5 )で実行すると、次のように表示されます。
VSの横にコンソールウィンドウはなく、フォームアイコンのみを獲得します:
前に説明したように、誰もいないときにコンソールに書き込もうとすると、他のすべての呼び出しはConsole.WriteLine
コンソール アプリケーションに影響しません。そのため、コンストラクターでブレークポイントをステップ実行しても、コンソール メッセージを表示できます。