C# 托管代码中的MiniTumpWriteDomainp引发AccessViolationException

C# 托管代码中的MiniTumpWriteDomainp引发AccessViolationException,c#,.net,interop,clr,minidump,C#,.net,Interop,Clr,Minidump,在我的C#(3.5)项目中,我从互联网上复制了基本的MiniDumpWriteDump方法interop 到目前为止,我已经使用这段代码注册了UnhandledException事件,以便在进程关闭之前进行崩溃转储 在我现在面临的一个特定场景中,我已将此函数设置为在其他情况下使用,以获取进程的诊断内存转储 无论何时调用此函数(不是从UnhandledException处理程序),它都会抛出AccessViolationException异常 下面是MiniDump代码的样子(删除了一些冗余部分)

在我的C#(3.5)项目中,我从互联网上复制了基本的MiniDumpWriteDump方法interop

到目前为止,我已经使用这段代码注册了UnhandledException事件,以便在进程关闭之前进行崩溃转储

在我现在面临的一个特定场景中,我已将此函数设置为在其他情况下使用,以获取进程的诊断内存转储

无论何时调用此函数(不是从UnhandledException处理程序),它都会抛出AccessViolationException异常

下面是MiniDump代码的样子(删除了一些冗余部分):

本机类型的定义如下:

//typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
        //    DWORD ThreadId;
        //    PEXCEPTION_POINTERS ExceptionPointers;
        //    BOOL ClientPointers;
        //} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
        // Pack=4 is important! So it works also for x64!
        [StructLayout(LayoutKind.Sequential, Pack = 4)]  
        struct MiniDumpExceptionInformation
        {
            public uint ThreadId;
            public IntPtr ExceptionPointers;
            [MarshalAs(UnmanagedType.Bool)]
            public bool ClientPointers;
        }

Marshal.GetExceptionPointers()可能返回IntPtr.Zero(可能是在操作系统认为异常已处理时)。如果是这种情况,您可以尝试将“MiniDumpWriteDump”的调用放在其他地方。我也遇到了同样的问题,通过将“minidumpWriteDomain”放入事件处理程序“AppDomain.CurrentDomain.FirstChanceException”中解决了它。

我没有发现任何错误。少了很多东西,少了什么?同样的代码在未处理的异常处理程序的上下文中工作得非常好,但是在另一种情况下,异常处理程序失败。我还可以在我的原始问题中添加什么来让它更清楚呢?好吧,对于初学者来说,访问冲突异常本身似乎在实际操作中丢失了。你能包括一个堆栈跟踪吗?
//typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
        //    DWORD ThreadId;
        //    PEXCEPTION_POINTERS ExceptionPointers;
        //    BOOL ClientPointers;
        //} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
        // Pack=4 is important! So it works also for x64!
        [StructLayout(LayoutKind.Sequential, Pack = 4)]  
        struct MiniDumpExceptionInformation
        {
            public uint ThreadId;
            public IntPtr ExceptionPointers;
            [MarshalAs(UnmanagedType.Bool)]
            public bool ClientPointers;
        }