[英]GetLastWin32Error() implementation change
在將開發環境從.Net 3.5切換到.Net 4.0之后,以下代碼無法正常工作。 我認為Marshal.GetLastWin32Error()的實現已更改。
使用.Net 3.5返回32,但是使用.Net 4.0返回0。
我該如何解決這個問題? 有什么建議嗎?
private StarterFile(string path, FileMode mode, FileAccess access, FileShare share, out bool isLocked)
{
isLocked = false;
m_Path = path;
m_Mode = mode;
m_Access = access;
m_Share = share;
try
{
m_Stream = new FileStream(path, mode, access, share);
m_Handle = m_Stream.SafeFileHandle;
}
catch (IOException)
{
int error = Marshal.GetLastWin32Error();
if (!HandleFileIoError(error, "File locked") && error == ERROR_SHARING_VIOLATION)
{
isLocked = true;
}
else
throw;
}
}
FileStream尚未更改,它仍然使用Marshal.GetLastWin32Error()本身來生成適當的異常。
什么可能已經改變的代碼,因此FileStream代碼和catch塊之間坐鎮山 。 在沒有更改該錯誤代碼的情況下,沒有一個可以調用winapi函數。
它是可修復的,IOException對象實際上存儲了原始的winapi錯誤代碼。 將其從異常對象中移出有點尷尬,不幸的是Exception.HResult是一個受保護的屬性。 但是有了后門,您可以使用Marshal.GetHRForException()來解決它。 您只需要處理Winapi錯誤代碼(已轉換為COM錯誤代碼),方法是將值添加0x80070000。 因此,使其類似於以下內容:
catch (IOException ex) {
var hr = (uint)Marshal.GetHRForException(ex);
if (hr == 0x80070000 + ERROR_SHARING_VIOLATION) {
// Report sharing violation
//...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.