C# 我应该从P/Invoke不安全代码中期待哪些异常?

C# 我应该从P/Invoke不安全代码中期待哪些异常?,c#,.net,pinvoke,C#,.net,Pinvoke,在我的解决方案中,我写了以下内容: [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] static extern unsafe bool CopyFileEx(string lpExistingFileName, string lpNewFileName, CopyProgressRoutine lp

在我的解决方案中,我写了以下内容:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern unsafe bool CopyFileEx(string lpExistingFileName,  
 string lpNewFileName, CopyProgressRoutine lpProgressRoutine, IntPtr lpData,  
 Boolean* pbCancel,    CopyFileFlags dwCopyFlags);

...

bool result;

unsafe{
  result = CopyFileEx(sourceFile, targetFile, null, IntPtr.Zero,  
                      null /* pointer */, 0);
}

if(!result)
    Win32Exception exc = new Win32Exception(Marshal.GetLastWin32Error()); 
// parameter could be omitted according to Win32Exception constructor 
// implementation
假设CopyFileEx是使用DllImport属性的SetLastError=true参数导出的,那么我是否有机会在这里获得任何未处理的异常


我对包装在RuntimeWrappedException实例中的非CLR异常特别感兴趣。在C++中,“抛出1”是一个有效的构造。那么,我应该从这些P/Invoke调用中得到什么样的异常,以及在哪里可以获得有关异常的信息(MSDN没有说明CopyFileEx中的异常)?

如果DLL使用Win32结构化异常处理系统,那么DLL引发的任何异常都将转换为

OutOfMemoryException
AccessViolationException
NullReferenceException
(很少),或
sehexException

< C++ >运行时WordPosivestux<代码>仅在托管C++抛出非<代码>异常< /代码>派生对象时使用。它不用于非托管DLL。如果您有一个管理的C++ DLL,它执行了<代码> > 1 ,那么您可以捕获<代码>运行时WrPrExpExtExc<

SEHException
充当非托管DLL中不可映射类型的SEH异常的总括。这将包括任何C++类,或者<代码>抛出1 示例。顺便说一句,没有办法从
SEHException
中提取特定于C++的异常信息,尽管我相信如果您足够努力,它是可以被破解的

请注意,有一些DLL不使用Win32结构化异常处理系统。最显著的是Cygwin DLL。在这种情况下,任何C++异常都可能会破坏进程或至少线程。当然,所有的Windows DLL(包括定义为<代码> CopyFieleX <代码> >的所有版本都使用Win32结构化异常处理,就像微软C++编译器创建的任何非托管DLL一样。
还请注意,Win32 API(包括
CopyFileEx
)通常不会使用Win32结构化异常报告错误;他们通过
GetLastError
报告这些错误。让大多数Win32函数抛出Win32结构化异常的唯一方法是向它传递非常无效的参数(例如要求它写入
ntdll.dll
)的中间部分。

可能重复的事实上,我还没有找到一个不可分解的答案,这是关于此主题的最全面的解释之一,尤其是W.R.T运行时WrdExtExpExt只能封装托管的C++异常。MSDN对此并不清楚。