2013-03-05 55 views

回答

2

CreateFile的dwDesiredAccessMode參數太不符合乾淨映射到一個枚舉。所以FileAccess在代碼中映射到一個int。從Reference Source's FileStream.cs源代碼文件,FileStream.Init()方法:

int fAccess; 
    ... 
    fAccess = access == FileAccess.Read? GENERIC_READ: 
    access == FileAccess.Write? GENERIC_WRITE: 
    GENERIC_READ | GENERIC_WRITE; 
    ... 
    _handle = Win32Native.SafeCreateFile(tempPath, fAccess, ...etc) 

原始縮進再現時,奇數,因爲它看起來。

+0

現在一切都很清楚。謝謝。 – Oksana 2013-03-05 13:05:01

0

Marshalling是類型之間的轉換,而不是值。換句話說,我不認爲CLR會做任何事情來幫助你解決你的問題。

如果您有一個接受整數的非託管函數(GENERIC_READ),並從.NET調用它,則需要傳遞值0x80000000而不是1. CLR無法知道您希望FileAccess.Read爲0x80000000。

+0

我只是用FileAccess,FileShare,FileMode和FileAttributes枚舉替換了非託管CreateFile()中的所有DWORD。它效果很好。 – Oksana 2013-03-05 12:37:32

+0

那應該與FILE_READ_DATA = 1常數匹配。我對CreateFile()API函數不是很熟悉,但我認爲只傳遞FILE_READ_DATA就足以成功讀取文件。 – floele 2013-03-05 13:31:10