興味深い問題。
WithEvents
自動化のプロパティはハンドラーを作成し、それをElapsed
デリゲートにアタッチするため、これはそうではありませんNULL
-したがって、例外はありません
ただし、がWithEvents
呼び出されると、(理論的には)デリゲートがnullであっても、例外が発生しないことは間違いありません。No
Timer.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に投げかけます-そこにいる誰かがおそらくもっとよく知っているでしょう。