2020年11月28日土曜日

「マネージとネイティブの境界の前でハンドルされませんでした」という例外でハマった。

 開発中のDLLをデバッグしているときに、「型 'System.Runtime.InteropServices.COMException' の例外が XXX.dll で発生しましたが、マネージとネイティブの境界の前でハンドルされませんでした」
という例外が出るようになって、非常に困ったので、まとめ。



例外が出るのはいいとして、

□この種類の例外がスローされると中断します
のチェックボックスをOFFにしても、必ず中断されてしまうから困ったのです。

しかも、ですよ。
catch(Exception e){}のブロックに入ってくれない。
最もひどい状態では、同じ部分で延々と例外のダイアログが表示され続けるために
「デバッグの中止」
を使ってプロセスを落とすしかなくなるんです。

ちなみに開発環境は Visual Studio 2015 です。
開発しているのは、Office Outlook 用のアドインDLL
メールのヘッダに独自に設定している拡張ヘッダがあるかどうかを調べるコードです。
一般のメールにはそのヘッダはないので、「そんなヘッダはありません」という例外が出ます。(それはいい)
try{}catch{}ブロックでその例外を無視すればいいだけのコードです。

まず、「catch(Exception e){}のブロックに入ってくれない。」件に関しては、プロジェクトのProperies 設定の「デバッグ」で
□ネイティブコードのデバッグを有効にする
をチェックすることで、catch{}ブロックに入ってくるようになりました。


しか~し。
□この種類の例外がスローされると中断します
のチェックボックスをOFFにしても必ず例外で中断する現象は変わりません。

開発環境によってはこの問題が発生しないので、上手くいく環境といかない環境を比較しながら調べてみました。
結論:「ツール」-「オプション」-「デバッグ」で
□例外が AppDomain またはマネージ/ネイティブの境界を超える場合にブレークする(マネージのみ)
を OFF にします。



以上で例外での中断がなくなりました。
この問題の解決にもけっこうな日数かかりました。orz