1. ホーム
  2. c#

C#のコードでネイティブの例外をキャッチできるか?

2023-09-16 03:49:36

質問

C# コードでは、アンマネージド ライブラリの奥深くからスローされるネイティブ例外をキャッチすることができますか?もしそうなら、それをキャッチするために何か違うことをする必要がありますか、それとも標準のtry...catchがそれを取得するのでしょうか?

どのように解決するのですか?

あなたは Win32Exception を定義し、その NativeErrorCode プロパティを使用して適切に処理します。

// http://support.microsoft.com/kb/186550
const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
const int ERROR_NO_APP_ASSOCIATED = 1155; 

void OpenFile(string filePath)
{
    Process process = new Process();

    try
    {
        // Calls native application registered for the file type
        // This may throw native exception
        process.StartInfo.FileName = filePath;
        process.StartInfo.Verb = "Open";
        process.StartInfo.CreateNoWindow = true;
        process.Start();
    }
    catch (Win32Exception e)
    {
        if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND || 
            e.NativeErrorCode == ERROR_ACCESS_DENIED ||
            e.NativeErrorCode == ERROR_NO_APP_ASSOCIATED)
        {
            MessageBox.Show(this, e.Message, "Error", 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Exclamation);
        }
    }
}