1

デバッグ中に問題が発生しましたが、取得できません。kernel32.dllのメソッドを使用して空きRAMを取得していますが、System.EngineExecutionExceptionがスローされ、キャッチしますが、デバッガーは例外で停止します。続行することを拒否します。では、なぜ例外がキャッチされないのですか?

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace StationController.Diagnose
{
public class Memorystatus
{
    public UInt32 Length;
    public UInt32 MemoryLoad;
    public UInt32 TotalPhys;
    public UInt32 AvailPhys;
    public UInt32 TotalPageFile;
    public UInt32 AvailPageFile;
    public UInt32 TotalVirtual;
    public UInt32 AvailVirtual;
}
class Test
{
    [DllImport("kernel32")]
    private static extern void GlobalMemoryStatus(ref Memorystatus buf);

    private static UInt32 GetFreeRAM()
    {
        try
        {
            Memorystatus MemStat=new Memorystatus();
            GlobalMemoryStatus(ref MemStat);
        }
        catch (System.ExecutionEngineException){ return 0; }
        catch (System.Exception) { return 0; }
        catch { return 0; } //I know kind of redundant
        return sMemStat.AvailPhys;
    }
}
}

[ツール]->[オプション]->[例外がAppDomainの外部にある場合に停止する]がオフになっている

例外の理由はすでに修正されています。Memorystatusはクラスではなく構造体である必要があります。この質問はtry-catchの動作に関するものです。

4

1 に答える 1

3

System.EngineExecutionExceptionは、内部の.NETエラーであり、私が知る限り、何かがひどくうまくいかない場合にCLRによってスローされます。

キャッチ可能ですか?私はそうは思いません-このレベルの例外はあなたのコードが実行し続けるのを妨げると思うので

http://social.msdn.microsoft.com/Forums/eu/clr/thread/4425321d-b291-4a2a-899c-8266f16e26d8

これはおそらく、アンマネージメモリをいじったことが原因です-たとえば、kernel32.dll呼び出し

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

于 2012-07-09T14:36:28.470 に答える