問題タブ [structlayout]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Compact Framework の StructLayout "Pack" 属性に代わるものはありますか?
私は次のことをしたいと思います:
コンパクト フレームワークでは Pack がサポートされていないため、代替手段はありますか?
更新: 構造体を明示的に設定し、それぞれに FieldOffset を指定しても、構造体のパック方法には影響しないため、機能しません。
Update2: 次のことを試してみると、構造がどのようにパックされているかにより、CF プログラムは実行されません。
信じられないかもしれませんが、試してみればわかります。これを CF プロジェクトに追加して実行しようとすると、TypeLoadException が発生します。オフセットをそれぞれ 0,4,8,10 に変更すると機能します (ただし、サイズは最終的に 12 になります)。
おそらく誰かがリフレクションを使用して、各フィールド型のサイズを個別にマーシャリングすることを望んでいました(構造体または型の配列内の構造体を処理するための再帰を伴うもの)。
c# - C# StructLayout.明示的な質問
以下の 2 番目の例が問題なく動作する理由を理解しようとしていますが、最初の例では以下の例外が発生します。どちらの例も、説明に基づいて例外を与えるべきだと私には思えます。誰でも私を啓発できますか?
未処理の例外: System.TypeLoadException: アセンブリ 'StructTest、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null' から型 'StructTest.OuterType' を読み込めませんでした非オブジェクト フィールドによって。
StructTest.Program.Main(String[] args) で任意のキーを押して続行します。. .
例 1
例 2
c# - C#で固定バイト/文字[100]をマネージド文字[]に変換する方法は?
C#で固定バイトまたはchar[100]をマネージドchar[]に変換する最良の方法は何ですか? 私はポインター演算を使用しなければならなくなったので、もっと簡単な方法があるかどうか疑問に思っています-memcpyまたは別の方法のようなものですか?
c# - ユニオンで PInvoke 構造体を呼び出すときに StructLayout( LayoutKind.Explicit ) を使用すると、何が間違っていますか?
以下は完全なプログラムです。上部の「#define BROKEN」のコメントを外さない限り、問題なく動作します。この中断は、PInvoke がユニオンを正しくマーシャリングできなかったことが原因です。問題のINPUT_RECORD
構造には、EventType の値に応じて使用されるサブ構造がいくつかあります。
私が理解していないのは、その単一の子構造のみを定義するKEY_EVENT_RECORD
と、オフセット 4 で明示的な宣言が機能するということです。しかし、同じオフセットで他の構造を追加すると、構造のコンテンツが完全にホースされます。
アップデート:
構造体の宣言自体が気になる方へ:
- bool は 32 ビット値として扱われます
- データのオフセット (4) の理由は、ユニオンがオフセット 2 で始まるのを防ぐ 32 ビット構造のアラインメントを可能にするためです。
繰り返しますが、私の問題は PInvoke をまったく機能させていません。これらの追加の構造 (おそらく同じオフセットにある) がデータを単純に追加することで、データを混乱させている理由を理解しようとしています。
c# - 構造体が COM Interop で機能しない場合、構造体に LayoutKind.Auto を使用する必要がありますか?
デフォルトでは、C# の構造体は、基本的に、これらのタイプのオブジェクトは COM 相互運用に一般的に使用され、それらのフィールドは定義された順序のままである必要があるという理由で実装されてい[StructLayout( LayoutKind.Sequential )]
ます。クラスがLayoutKind.Auto
定義されています。
私の質問は、構造体を明示的に指定する必要が[StructLayout( LayoutKind.Auto )]
あります。これにより、デフォルトよりも利点が得られますか? つまり、構造体がstackで初期化されている場合、違いはありますか?つまり、GCは構造体を移動する必要はありませんか? また、構造体がヒープ上で初期化されている場合、つまりクラスの一部である場合に役立ちますか?
c# - 構造体に DateTime フィールドが含まれている場合、LayoutKind.Sequential の動作が異なるのはなぜですか?
構造体に DateTime フィールドが含まれている場合、LayoutKind.Sequential の動作が異なるのはなぜですか?
次のコードを検討してください (「安全でない」を有効にしてコンパイルする必要があるコンソール アプリ)。
上記のコードを実行すると、次のような出力が得られます。
構造体のアドレス = 40F2CC
First のアドレス = 40F2D4 NotFirst
のアドレス = 40F2CC
First のアドレスは構造体のアドレスと同じではないことに注意してください。ただし、NotFirstのアドレスは構造体のアドレスと同じです。
ここで、構造体の "DateTime WTF" フィールドをコメントアウトして、もう一度実行します。今回は、次のような出力が得られます。
構造体のアドレス = 15F2E0
First のアドレス = 15F2E0 NotFirst
のアドレス = 15F2E8
現在、「First」は構造体と同じアドレスを持っています。
LayoutKind.Sequential の使用を考えると、この動作は驚くべきものだと思います。誰でも説明できますか?Com DATETIME 型を使用する C/C++ 構造体との相互運用を行う場合、この動作には影響がありますか?
[編集] 注: Marshal.StructureToPtr() を使用して構造体をマーシャリングすると、データが正しい順序でマーシャリングされ、「First」フィールドが最初になることを確認しました。これは、相互運用性で問題なく動作することを示唆しているようです。内部レイアウトが変更される理由は謎ですが、もちろん、内部レイアウトは指定されていないため、コンパイラは好きなことを行うことができます。
[EDIT2]構造体宣言から「安全でない」を削除しました(私が行っていたいくつかのテストから残っていました)。
[EDIT3] この質問の元のソースは、MSDN C# フォーラムからのものです。
c# - このように文字列の内容を変更すると、例外が発生しますか?
次のコードを検討してください。
このコードを実行することで、例外が発生することなく文字列の内容を変更できます。そのために安全でないコードを宣言する必要はありませんでした。このコードは明らかに非常に危険です!
私の質問は単純にこれです:あなたは例外が上記のコードによってスローされるべきだと思いますか?
[編集1:他の人が私のためにこれを試した、そして何人かの人が異なる結果を得ることに注意してください-私がしていることの厄介さを考えるとそれほど驚くことではありません...;)]
[編集2:Windows 7Ultimate64ビットでVisualStudio2010を使用していることに注意してください]
[EDIT3:テスト文字列をconstにしました。これは、さらに危険なものにするためです!]
c# - Marshal.PtrToStructure と String の問題
私は次のクラスを持っています
次のコードを入力します。
objBuffer の位置 2 (文字列の開始位置) に値がありますが、文字列は空のままです!
c# - FieldOffsetの予期しない動作を使用する構造体
明示的な構造体レイアウトと構造体オーバーレイを理解しようとしていますが、期待する動作が見られません。以下のコードを考えると:
これによる結果は次のようになると思います。
IntField1:1
IntField2:2
CharArray:ABCDEF
SomeByte:1
SubStruct:
{CharArray1:ABCDEF
CharArray2:ABCD
CharArray3:E}
しかし、結果は次のとおりです。
IntField1:1
IntField2:2
CharArray:ABCD
SomeByte:1
SubStruct:
{CharArray1:ABCD
CharArray2:ABCD
CharArray3:EF}
TestStructのCharArrayの長さが4であるのはなぜですか?ABCDEFが6文字であると想定しましたが、ABCDしか含まれていません。TestStruct2.CharArray1についても同じです。