興味深い問題。
WithEvents自動化のプロパティはハンドラーを作成し、それをElapsedデリゲートにアタッチするため、これはそうではありませんNULL-したがって、例外はありません
ただし、がWithEvents呼び出されると、(理論的には)デリゲートがnullであっても、例外が発生しないことは間違いありません。NoTimer.Start()Elapsed
これに対する簡単な説明は、NAVがWithEventsプロパティに関係なく空のデリゲートをアタッチすることです。それをサポートするために、コードをトリガーに入れてTimer::Elapsed()から離陸しWithEvents、元に戻すと、コードはまだ存在します(つまり、トリガーは変更されていない形式で存在します)。これにより、コードは常に存在する(つまり、空のデリゲート)という結論に傾くようになります。 )。
しかしもちろん、それはNAVなので、それほど単純なものではありません。
上記のMSDNの例からテストコードユニットを作成しましたが、自動化に小さな変更を加えました。
/// <summary>
/// Whenever the internal timer elapses, an event must be fired
/// </summary>
private void mTimer_Elapsed(object sender, ElapsedEventArgs e)
{
OnElapsed(EventArgs.Empty);
throw null;
}
NULLこれは、理論的には、呼び出されるたびにスローされるはずmTimer_Elapsedですが、NAVでは何も発生しません。私はもう少し進んでこれを変更しました:
///<summary>
/// Invoke the Changed event; called whenever the internal timer elapses
/// </summary>
protected virtual void OnElapsed(EventArgs e)
{
throw new InvalidCastException("test");
//Elapsed();
}
繰り返しますが、NAVでは何も起こりません。
COM Timerが.NETプロジェクト内から消費された場合、両方の変更が期待どおりに動作することに注意してください。これにより、NAV Interopは自動化からの例外をキャプチャし、それらを内部で処理する必要があると思います。
しかし、私はその質問をMibusoに投げかけます-そこにいる誰かがおそらくもっとよく知っているでしょう。