我想知道CLR如何匹配GENERIC_READ
與FileAccess.Read
,例如。我已經整理好了這個參數作爲UnmanagedType.U4CLR如何將C++文件訪問常量與C#枚舉相匹配?
#define GENERIC_READ (0x80000000L)
但
FileAccess.Read = 1
如何封送知道需要什麼?
我想知道CLR如何匹配GENERIC_READ
與FileAccess.Read
,例如。我已經整理好了這個參數作爲UnmanagedType.U4CLR如何將C++文件訪問常量與C#枚舉相匹配?
#define GENERIC_READ (0x80000000L)
但
FileAccess.Read = 1
如何封送知道需要什麼?
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)
原始縮進再現時,奇數,因爲它看起來。
Marshalling是類型之間的轉換,而不是值。換句話說,我不認爲CLR會做任何事情來幫助你解決你的問題。
如果您有一個接受整數的非託管函數(GENERIC_READ
),並從.NET調用它,則需要傳遞值0x80000000而不是1. CLR無法知道您希望FileAccess.Read
爲0x80000000。
現在一切都很清楚。謝謝。 – Oksana 2013-03-05 13:05:01