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 回答