3

例如,我想知道 CLR 如何与GENERIC_READ匹配FileAccess.Read。我已将此参数编组为 UnmanagedType.U4

#define GENERIC_READ (0x80000000L)

FileAccess.Read = 1

marshaler 如何知道需要什么?

4

2 回答 2

2

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)

原始缩进复制,看起来很奇怪。

于 2013-03-05T12:57:12.107 回答
0

编组是类型之间的转换,而不是值之间的转换。所以换句话说,我认为 CLR 不会做任何事情来帮助你处理你的案子。

如果您有一个接受整数 ( GENERIC_READ) 的非托管函数,并从 .NET 调用它,则需要传递值 0x80000000 而不是 1。CLR 无法知道您想要FileAccess.Read成为 0x80000000。

于 2013-03-05T12:20:03.380 回答