なぜ「内部静的外部」が必要なのですか?
internal
モディファイアは、メソッドの可視性を設定するだけです。internal
メソッドを宣言できるように、private
またはpublic
必要に応じて、他の標準メソッドで行うように、必須である必要はありません。
static
インスタンスメソッドではなく、そのメソッドはクラスを認識しない(ポインタを持たないthis
)ため、修飾子が必要です。
最後にextern
、メソッドがここではなく別の場所に実装されていることをコンパイラに通知する必要があります(属性を使用する場所を指定します)。Eveyextern
メソッドも宣言する必要がありstatic
ます(オブジェクトに関する知識がない単純な関数呼び出しであるため)。
SetLastErrorとは何ですか?
これは、メソッドがスレッドの最後のエラーコード値を変更する可能性があることを示しています。詳細については、GetLastError()
関数を参照してください。呼び出された関数がこの値を変更する場合は、MSDNからに設定SetLastError
することをお勧めします。true
ランタイムマーシャラーはGetLastErrorを呼び出し、返された値をキャッシュして、他のAPI呼び出しによって上書きされないようにします。GetLastWin32Errorを呼び出すと、エラーコードを取得できます。
つまり、GetLastError()によって返された値を内部キャッシュに保存するため、システムAPIへの他の呼び出し(他のフレームワーク関数の内部であっても)はその値を上書きしません。
なぜLayoutKind.Sequential?
.NETのクラスレイアウトは、メモリ内でシーケンシャルである必要はありません(シーケンシャル=A
前に宣言された場合B
、メモリレイアウトはA
前にありますB
)。これは、宣言の順序が重要なCでは当てはまりません(宣言は、生データのメモリ内のレイアウトを理解するためにコンパイラによって使用されます)。C関数と相互運用する必要がある場合は、それらに渡すデータのレイアウトについて確認する必要があります。これがどのようにLayoutKind.Sequential
機能するかです。これは、。内のデータの宣言の順序を尊重するようにコンパイラーに指示しstruct
ます。これは、管理されていない世界と相互運用する唯一のオプションではありません。各フィールドのオフセット(構造体の先頭から)を明示的に設定することもできます(LayoutKind.Explicitを参照)。