StructLayoutの機能
目次
1.ブログ紹介
Windowsを取得するためのwin32APIの呼び出しに関する前回の記事を書いたとき、いくつかのStructLayout書き込みメソッドを見ましたが、最初は書き込みメソッドの意味をよく理解していないものもありました。少し調べてみると、このブログは知識を記録しています。
2.コンテンツ
(1)ユースケースの作成
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
public class StringClass
{
[FieldOffset(0)] public string str1;
[FieldOffset(1)] public string str2;
[FieldOffset(2)] public string str3;
[FieldOffset(3)] public string str4;
[FieldOffset(4)] public string str5;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class FileDlg
{
public int structSize = 0;
public IntPtr dlgOwner = IntPtr.Zero;
public IntPtr instance = IntPtr.Zero;
public String filter = null;
}
(2)役割
StructLayoutは、着信構造のレイアウトが、ターゲットの呼び出しコードに必要なレイアウトと一致していることを確認できます。
パラメーター:LayoutKind
このパラメーターには、SequentialとExplicitの2つの属性があります。Sequentialパラメーターは、変更されたメソッドまたは構造内の属性が渡され、順番に呼び出されるようにします。Explicitは、[FieldOffset(0)]によって属性の順序を正確に見つけることができます。
パラメータ:CharSet = CharSet.Auto
エンコード形式
(3)使用シナリオ
デフォルトでは、調整によってメモリを節約できるため、.netは管理対象オブジェクトのレイアウトを調整します。ただし、この自動調整が必要ない場合もあります。その理由は、win32apiを呼び出すと、元のAPIがアンマネージコードに属しているためです。これらのコードの対応する構造のレイアウトは確実であり、渡すパラメーターはに準拠している必要があります。元のレイアウト。この時点で、StructLayoutを使用して、着信構造のレイアウトがターゲットの呼び出しコードに必要なレイアウトと一致していることを確認できます。
3.プッシュ
Github:https://github.com/KingSun5
4.結論
ブロガーの記事がよく書かれていると思われる場合は、ブロガーに注意を払い、ブログ投稿を気に入ってください。また、ブロガーの能力は限られています。記事に誤りがある場合は、コメントして批判してください。 。
QQ交換グループ:806091680(中国人)
このグループは、CSDNブロガーのChinarによって作成されました。お勧めします。私もグループにいます!