問題タブ [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.

0 投票する
1 に答える
2254 参照

c# - c# での StructLayout との結合

すべてヘッダー構造体で始まる複数の構造体があります。このような

ヘッダーは

問題は、それらを Byte[] で結合する必要があることです。これでやってみた

バッファにデータを入力すると、ヘッダーからデータを取得できません。c++ のユニオンと同じように c# を作成するにはどうすればよいですか?

0 投票する
4 に答える
2861 参照

c# - バイト配列をshortに変換するStructLayout

恐ろしいタイトルについては申し訳ありませんが、私は正直なところ、私が何を望んでいるのか、何が間違っているのかを知っています...

基本的に、私は次のような構造体を持っています(250以上の構造体がありますが、それらはすべて同じアイデアに従います)。

問題は、バイト配列が参照型であり、shortが値型であり、fieldoffsetを同じメモリ位置に設定できないことです...

別の方法で作成するためだけに、作成したすべての構造体を削除する必要があるのは本当に嫌です。だからここに私の質問があります、どうすればこれをうまくいくように使うことができますか?基本的に私がやろうとしていることはこれです:

構造体を生成したくないので、コンパイルすら拒否します/:

誰かが他の方法を提案する前に、私がこれを行う理由は、超高速が必要なためです... ByteReaderや他の方法(BitConverterなど)を使用できますが、それよりも少し高速である必要があります...

私はビット単位のシフトから始めましたが、パケットIDを取得した後、別の構造体でそれを読み取るため、より「動的な」方法が必要でした。たとえば、次のようになります。

多くのインライン「ビット単位のたわごと」を用意する代わりに、これを行うための簡単で非常に高速な方法が必要です...簡単ではなく高速になっているようです/:

助けてください!安全でないコードは問題ありませんが、管理されたバージョンも好みます。

FAIL :(:値型をボックス化することで参照型に変換できることを思い出してください(オブジェクト型にキャストします)。ただし、これはREAL戻り型を削除し、単なるオブジェクトであると言います。とにかく、嘘をつくことができるXMLドキュメントがあります。リターンタイプについて? 悲しいことに動作しませんD:

更新: OK、今私は持っています:

しかし、それを変換するために毎回メソッドを呼び出さなければならないのは少し面倒です:(誰かがこれ以上の提案を得ましたか?

ありがとう、JD

0 投票する
2 に答える
435 参照

c# - メモリへの DWORD 整列ハンドルの PInvoke

MSDNACCESS_DENIED_ACEで定義されているように、構造体に相当する C# を作成しようとしていました。

SidStartトラスティの SID の最初の DWORD はどこにありますか。SID の残りのバイトは、SidStart メンバーの後の連続したメモリに格納されます。

のように使用される例を見てき(PSID) &accessAllowedAce->SidStart ましたが、

これでC#StructLayoutをどのように記述し、関数でどのように使用できるEqualSidか、またソリューションがどのように機能するかを説明してください。

0 投票する
1 に答える
948 参照

.net - 暗黙的なコンストラクターを使用して F# 型に StructLayout 属性を追加する

私が持っている:

しかし、エラーが発生します:暗黙のコンストラクターを持たない構造体とクラスのみに「StructLayout」属性を与えることができます

だから私はそれが似ているに違いないことを理解しています:

しかし、この方法でインターフェースを失いました。たとえばC#ではtype:StructLayout、このタイプのクラスに追加が可能です(私は思います)。このエラーを回避するには、コードをどのようにリファクタリングする必要がありますか?

0 投票する
2 に答える
681 参照

c# - p/invoke からの構造体レイアウトの変更

ap/invoke 関数に返される/渡されるオブジェクトの構造体/クラス レイアウトの変更に関するベスト プラクティス ガイダンスを探しています。これに対する答えを探しましたが、疲れすぎて効果的に検索していないのかもしれません。

私が思いつく最も単純な例 (実際の例はここでは少し複雑すぎます) は、GetWindowRectのようなものです。

RECT 構造体にいくつかの追加プロパティを追加したい場合、構造体自体の定義に追加するだけですか、それともサブクラス化に切り替えて追加プロパティを追加する必要がありますか?

次の方法に関して、Microsoft または別の信頼できる情報源からのベスト プラクティスはありますか? これらはどちらもベストプラクティスに反していますか?

0 投票する
1 に答える
2370 参照

c# - サブ構造体に LayoutKind.Explicit がある場合、LayoutKind.Sequential は従わない

このコードを実行すると:

x86 と x64 の両方でこの出力が期待されます:
4 または 8 (x86 または x64 に応じて)

2
3
1
6
0
4
5
ゴミ

x86で代わりに得られるもの:
4

6
0
2
3
1
4
5
ゴミ

x64で代わりに得られるもの:
8

6
0
2
3
1
0
4
5

詳細:
- LayoutKind.Explicit および FieldOffset 属性を削除すると、問題は解決します。
- Bool フィールドを削除すると、問題が解決します。
- Long フィールドを削除すると、問題が解決します。
- x64 では、Pack=4 属性パラメーターも無視されているように見えることに注意してください。

これは、.Net3.5 および .Net4.0 にも適用されます。

私の質問:何が欠けていますか?それともこれはバグですか?
同様の質問を見つけました:
構造体に DateTime フィールドが含まれている場合、LayoutKind.Sequential の動作が異なるのはなぜですか?
しかし、私の場合、サブ構造体の属性が変更されても、データ型を変更せずにレイアウトが変更されます。したがって、最適化のようには見えません。それに加えて、他の質問がまだ答えられていないことを指摘したいと思います。
その他の質問では、マーシャリングを使用するときにレイアウトが尊重されると述べています。私はそれを自分でテストしていませんが、関連するすべての属性が適切に配置されているように見えるのに、安全でないコードに対してレイアウトが尊重されないのはなぜでしょうか? マーシャリングが行われない限り、これらの属性は無視されるとドキュメントのどこかに記載されていますか? なんで?
これを考慮すると、安全でないコードに対して LayoutKind.Explicit が確実に機能することを期待できますか?
さらに、ドキュメントには、構造体を予想されるレイアウトで保持する動機について言及されています。

Auto 値に関連するレイアウト関連の問題を軽減するために、C#、Visual Basic、および C++ コンパイラは、値の型に Sequential レイアウトを指定します。


しかし、この動機はアンセーフ コードには当てはまらないようです。

0 投票する
2 に答える
544 参照

c# - .NET4.0 でメモリを共有する配列 - リフレクションまたは StructLayout で可能ですか?

私は巨大な一時的な配列を急速に作成しています。一部は保持され、一部はGC-dです。これによりヒープが最適化され、アプリは約を消費します。実際に必要なメモリの 2.5 倍のメモリが必要になるため、OutOfMemoryException が発生します。

解決策として、私は 1 つの巨大な配列 (PointF[]) を持ち、自分でセグメントの割り当てと管理を行うことを好みます。しかし、どうすれば 2 つ (またはそれ以上) の配列で同じメモリ空間を共有できるのでしょうか。

この SO questionの勝者の答えのようなトリックを考えています。それは可能でしょうか?問題は、セグメント配列の長さと数が実行時にしか分からないことです。

0 投票する
1 に答える
622 参照

c# - C# パック 1 StructLayout ネットワーキング

自分で作成したサーバーからクライアントにバッファーを送信しようとしています。TCP 上のソケットで動作します。

送信する必要がある構造体があります。

そして、これらの関数を使用して、バイト配列から構造体に、構造体からバイト配列に変換しました。

クライアントでバッファを受け取りますが、クライアントが ByteArrayToStruct 関数を使用しようとすると、実行時エラーが発生します。

0 投票する
1 に答える
1198 参照

c# - System.DateTime 構造体にレイアウト種類 Auto があるのはなぜですか?

構造体System.DateTimeとそのいとこSystem.DateTimeOffsetの構造体レイアウトの種類は「自動」に設定されています。これは次のように表示できます。

また:

または、次のように宣言する IL から確認できます。

通常、C# で記述された構造体 (つまり、列挙型ではない .NET 値の型) のレイアウトは "Sequential" になります (StructLayoutAttribute別のレイアウトを指定するために a が適用されていない場合)。

いくつかの一般的なBCLアセンブリを検索したところ、このレイアウトで見つかった公開されている構造体は と だけでしたDateTimeDateTimeOffset

なぜDateTimeこの珍しい構造体レイアウトがあるのか​​ 誰にも分かりますか?

0 投票する
0 に答える
746 参照

c# - C# StructLayout Pack は System.NullReferenceException を取得し、位置合わせの問題?

まず第一に、私には多くの回避策があるので、私は立ち往生していません!! 最高なのは、もう 1Byte Pack が必要ないことです :P

しかし、正直なところ、私はその行動についてかなり困惑しています。Unity を使用しています。Windows では問題なく動作しますが、Android (mono) では失敗しました。

  • 無効なものを書いたことがありますか?
  • Monoにバグがありますか?!

コメント大歓迎です!!

いくつかの追加情報/手がかり:

  • Android/Windows の違いは、おそらくプロセッサ アーキテクチャの違い Android ARM(RISC) に由来します。

  • [StructLayout(LayoutKind.Sequential, Pack = 1)] は、構造体以外にも影響を与えるようです。

メモリ アラインメントはおそらく次のようになります。

私がもっと期待されていたのは、次のようなものです。