問題タブ [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# - 構造体が正しく配置されていません: System.TypeLoadException
次の構造体を C# で作成しようとしています。これは C に基づく複雑な構造体です。ほとんどのマーシャリング オプションを試しましたが、常に「System.TypeLoadException」が発生します。
(追加情報: アセンブリ 'WindowsFormsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' から型 'WindowsFormsApplication1.COMPLEX_STRUCT' を読み込めませんでした。これは、オフセット 8 にオブジェクト フィールドが含まれているためです。 -オブジェクトフィールド。)
IPV6_ADDR 構造体に関して、私は LayoutKind.Explicit と LayoutKind.Sequential の両方を試しました。
x64 マシンを使用していますが、IPV6_ADDR 構造体が 8 バイトにアラインされているため、何が問題なのかわかりません。
私が模倣しようとしている元のC構造体:
c# - StructLayouts をいじると FatalExecutionEngineError
私はstructlayoutsをいじっていて、かなり奇妙なものを見つけました:
次のコードは、思ったとおりに機能しています。
ただし、classB.Value を int に変更すると、このコードは前述の FatalExecutionEngineError をスローします。
誰かが理由や回避策を説明できますか? これはおそらく複雑すぎて、ここをいじっているだけだと思いますが、誰かが挑戦したいかもしれません.
c# - 構造体で動作するように動作するクラスで StructLayout を作成する
アンマネージ コードを扱う場合、構造体/クラスのマッピングをよりよく理解したいと思います。
次の構造体を定義しました。
次の方法で使用します。
構造体である限りうまく機能しますが、クラス ProfileInfo
を作成すると LoadUserProfile が失敗し始めます。ProfileInfo
なぜだろう?
私にとって、 StructLayout はクラスまたは構造体に同じ方法で適用されました。
LoadUserProfile を struct から class に変更すると失敗する ProfileInfo のメモリ表現の違いは何ですか?
c# - C# で「PROCESSENTRY32W」?
Process32FirstW
関数と構造体を次のPROCESSENTRY32W
ように宣言しました。
(64ビットプロセスで)呼び出すときProcess32FirstW
、私はいつもTypeLoadException
ことわざを受け取ります
ProcessEntry
オフセット 44 のオブジェクト フィールドが正しく配置されていないか、オブジェクト フィールドではない別のフィールドと重なっているため、型を読み込むことができませんでした。
また、 forchar[]
の代わりに使用して、構造体の でand を使用してみました。私は常に568 に設定し、C++ プログラム (64 ビット ビルド) からオフセット データをコピーしました。string
ProcessEntry.ExeFile
Pack=4
Pack=8
StructLayoutAttribute
ProcessEntry.Size
何がうまくいかないのかわからないので、64 ビット アプリケーションの C# で宣言する方法を教えてください。 C++/CLI を使用する必要がありますか、それとも単にここで何か間違ったことをしているのですか?PROCESSENTRY32W
編集:このコードを 64 ビット プログラムとして実行すると、私にとっては問題なく動作します。
c++ - C++ 構造体のレイアウトについて、どうすれば推測できないのでしょうか?
VC++ 14.0 (2015) コンパイラのバグから学んだばかりですか? 構造体のレイアウトがメモリ内でどのようになるかについて、仮定をするべきではありません。ただし、私が見た多くのコードでそれがどのように一般的であるかがわかりません。たとえば、Vulkan グラフィックス API は次のことを行います。
構造体を定義します
次に、そのフィールドに入力します。
次に、構造体 (ホスト メモリ内) を memcpy 経由でデバイス メモリにコピーします。
次に GPU に渡って、その構造体に一致するように UBO を定義します。
次に、GPU 側では、ubo は常に uboVS と一致します。
これは同じ未定義の動作ですか?そのコードは、uboVS 構造体が定義どおりに正確にレイアウトされることに依存していないか、または両側 (コンパイルされた C++ コードとコンパイルされた SPIR-V シェーダー) が基本的に同じ異なる構造体レイアウトを生成することに依存していませんか? ( https://www.securecoding.cert.org/confluence/display/c/EXP11-C.+Do+not+make+asssumptions+regarding+the+layout+of+structures+with+の最初の例に似ていますビットフィールド)
この質問は、Vulkan やグラフィックス API に固有のものではありません。正確に何を想定できるのか、構造体をメモリのチャンクとして使用してもよいのはいつなのか、興味があります。構造体のパッキングと配置は理解していますが、それ以上のことはありますか?
ありがとう
c# - C# StructLayout Pack=?? ブール値で使用するため
C# では、bool 型の 16 個の変数を含む複数の異なる構造体を作成しています。これらの構造体をいくつか用意し、他のデータ型と組み合わせてより複雑な構造体にします。長さ 2 バイトとして扱う必要があります。以下のコードでは、タイプ CtrlWord1 で作成された変数は、Pack 値が 0、1、2 のいずれで作成されたかに関係なく、Marshal.SizeOf を実行すると長さが 64 になります。
c# - 構造体のポインター フィールドのサイズ
安全でないコードで動作する構造体を定義する必要があるため、すべてのフィールドの FieldOffset 値を設定する必要があります。しかし、ポインタのサイズを定義できません。コードは次のとおりです。
IntPtr.Size は定数式ではなく、もちろんこれもコンパイルされないため、エラーが発生します。
質問のタイトルになると、FieldOffset定義で特定の「32ビット64ビットコンパイル」ポインターデータサイズを設定する方法がより多くなります。
編集:また、「public int [] SomeNumbers;」を入れることはできません 構造体に2つの異なる配列があるため、構造体の最後にあるフィールド..「public int [] SomeOtherNumbers;」のように