1

PInvoke を介して C++ アンマネージド DLL と対話する C# .NET 4.0 アプリケーションをテストしています。DLL によってスローされた例外をキャッチしたいと考えています。ネイティブ例外を処理するために、dll 関数を try/catch 句でラップしていますが、起動すると無視されます。試した:

try { } catch {}
try {} catch (Exception)
try {} catch (SEHException)
try {} catch (Win32Exception)

無駄に

機能する唯一のオプションは、DllImport SetLastErrorプロパティを true に設定し、関数チェックを呼び出した後に次のようにすることです。

if (Marshal.GetLastWin32Error() !=0) 

これは満足のいく解決策ですが、他のオプションが効果を発揮しない理由と、たとえば例外が .

System.ComponentModel.Win32Exception (0x80004005): There is not enough space on the disk

それはWindows API自体からの通知ですか?

4

1 に答える 1

2

簡単な説明は、ネイティブ コードが例外をスローしないということです。はい、GetLastWin32Error() を使用することは、Windows API 関数のボイラー プレートです。それほど一般的ではありませんが、他のコードでも使用される可能性がありますが、誰でも SetLastError() を呼び出してスレッドのエラー コードを設定できます。それ以外の場合、C コードは意図的に例外をスローすることはありません。言語はそれをサポートしていません。

0x80004005 エラー コードは COM エラー コード、E_FAIL です。COM 関数を呼び出すために pinvoke を使用しないでください。CLR の COM 相互運用機能のサポートは、インポート ライブラリを介してそれを処理します。COM エラーの例外が発生します。CLR は、COM メソッドが失敗コードを返したことを確認すると、例外をスローします。また、IErrorInfo を使用して、Exception.Message プロパティで返されるエラー コードのより適切な説明を取得します。

于 2012-07-13T17:38:40.380 に答える