1

Navision 5がCOM相互運用機能を介して外部アプリケーションと通信する方法を理解しようとしているときに、次の例を見つけました。

http://msdn.microsoft.com/en-us/library/aa973247.aspx

実装された2番目のケースは、まさに私がやりたいことです。コードをテストし(マイナーな変更を加えて-[ComVisible(true)]イベントインターフェイスとクラスにいくつかの属性を追加しました)、これらの変更を行うと、例に示されているように機能しました。

ただし、次のように呼び出しても例外が発生しない理由がわかりませんCOMTimer.Elapsed

protected virtual void OnElapsed(EventArgs e)
{
  Elapsed();
}

このイベントに夢中になっているのは誰ですか?私が見ることができる唯一の「フック」は、のイベントをmTimer.Elapsed += new ElapsedEventHandler(mTimer_Elapsed);参照するものです。ElapsedmTimer

通常、関数でElapsednullになりOnElapsedます。

よろしくお願いします。前もって感謝します。

4

1 に答える 1

3

興味深い問題。

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に投げかけます-そこにいる誰かがおそらくもっとよく知っているでしょう。

于 2013-01-22T11:27:21.680 に答える