3

たとえば、CLRがどのように一致するGENERIC_READのか知りたいです。FileAccess.ReadこのパラメーターをUnmanagedType.U4としてマーシャリングしました

#define GENERIC_READ (0x80000000L)

しかし

FileAccess.Read = 1

マーシャラーはどのようにして何が必要かを知るのですか?

4

2 に答える 2

2

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)

オリジナルのインデントが再現されています。見た目は奇妙です。

于 2013-03-05T12:57:12.107 に答える
0

マーシャリングは、値ではなく型間の変換です。言い換えれば、CLR があなたのケースを助けるために何もしないと思います。

整数 ( GENERIC_READ) を受け入れるアンマネージ関数があり、それを .NET から呼び出す場合、1 ではなく 0x80000000 の値を渡す必要があります。CLR は、0x80000000 になりたいことを認識できませんFileAccess.Read

于 2013-03-05T12:20:03.380 に答える