例如,我想知道 CLR 如何与GENERIC_READ
匹配FileAccess.Read
。我已将此参数编组为 UnmanagedType.U4
#define GENERIC_READ (0x80000000L)
但
FileAccess.Read = 1
marshaler 如何知道需要什么?
例如,我想知道 CLR 如何与GENERIC_READ
匹配FileAccess.Read
。我已将此参数编组为 UnmanagedType.U4
#define GENERIC_READ (0x80000000L)
但
FileAccess.Read = 1
marshaler 如何知道需要什么?
CreateFile 的 dwDesiredAccessMode 参数太不正常,无法干净地映射到枚举。所以 FileAccess 在代码中被映射到一个 int。从Reference Source 的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)
原始缩进复制,看起来很奇怪。
编组是类型之间的转换,而不是值之间的转换。所以换句话说,我认为 CLR 不会做任何事情来帮助你处理你的案子。
如果您有一个接受整数 ( GENERIC_READ
) 的非托管函数,并从 .NET 调用它,则需要传递值 0x80000000 而不是 1。CLR 无法知道您想要FileAccess.Read
成为 0x80000000。