たとえば、CLRがどのように一致するGENERIC_READ
のか知りたいです。FileAccess.Read
このパラメーターをUnmanagedType.U4としてマーシャリングしました
#define GENERIC_READ (0x80000000L)
しかし
FileAccess.Read = 1
マーシャラーはどのようにして何が必要かを知るのですか?
たとえば、CLRがどのように一致するGENERIC_READ
のか知りたいです。FileAccess.Read
このパラメーターをUnmanagedType.U4としてマーシャリングしました
#define GENERIC_READ (0x80000000L)
しかし
FileAccess.Read = 1
マーシャラーはどのようにして何が必要かを知るのですか?
CreateFile の dwDesiredAccessMode 引数は、列挙型にきれいにマップするにはあまりにも奇抜です。したがって、FileAccess はコードで int にマップされます。リファレンス ソースの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 から呼び出す場合、1 ではなく 0x80000000 の値を渡す必要があります。CLR は、0x80000000 になりたいことを認識できませんFileAccess.Read
。