みなさん、おはよう、
ここで少し言語理論の質問があります... C# の例外処理とデリゲートが場合によっては異なる動作をすることを示唆する参考文献をオンラインで見つけましたが、この問題に関する具体的なドキュメントは見つかりません。
最近、Microsoft Excel アドインのデリゲート内で例外が発生し、MSVC ランタイムでハード クラッシュが発生するという大きな問題が発生しました。デリゲートを削除することでこれは解決しましたが、私は今、悲惨な詳細を知りたいと思っています.
コアコードの簡潔な例として:
Delegate del; // initialized elsewhere
try
{
del.DynamicInvoke();
}
catch(Exception e)
{
/* Parsing of exception to generate user-friendly message here */
}
上記の構成により、集中型のエラー処理が可能になり、純粋なコードの観点からは、クリーンで簡潔になりました。公開されている各関数はデリゲートとして宣言され、上記のフラグメントを介して実行されます。
単純なコンソール アプリでは、デリゲートから例外をスローするか、単純な予期しないエラー (たとえば、null ポインターで ToString() を "誤って" 呼び出す) をスローすると、期待どおりに機能し、エラーは必要に応じて処理されます。
MS Excel を投入すると、ハード クラッシュが発生します。コードをステップ実行すると、エラーが発生した場所が示されますが、すべてが破壊の大きな火の玉になる前に、スタックの巻き戻しが行われていないように見えます。
私の仮説は、.NET ランタイム (つまり、コード) をホストしている COM が、通常の .NET コードの実行とは異なることを行っているというものです。これによりエンドポイントが強制終了され、Excel はこれを認識せず、COM を介してエンドポイントにアクセスしようとしますが、エンドポイントが何らかの形で消失したことを確認し、Excel が代わりにクラップアウトします。
これは、Excel + COM + デリゲートの組み合わせでのみ発生しますが、この動作でどちらがより影響力があるかは正直わかりません... 何か考えはありますか?