簡體   English   中英

GetLastWin32Error()實現更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM