問題タブ [marshalling]
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# - IntPtr をオブジェクトに戻す方法
すべて、これは前の質問からのフォローアップです: C# フォーマットの外部 Dll 関数パラメーター
具体的には、C# に変換しようとしているコードです。
関数「FILES_GetMemoryMapping」は2回呼び出されます.1回目は構造体のサイズを取得し、2回目は実際にそれを埋めるためだと思います.
「pMapping」は C++ の構造体へのポインターです。私の C# コードでは、pMapping を IntPtr 型として持っています。次の行に変換できます:
(UM0516.Mapping) が構造体です。かっこいいので、IntPtr が指しているスペースを割り当てました。次の行は... "pMapping->NbSectors = 0;"
現在割り当てられているアンマネージ メモリ空間に移動し、それを (UM0516.Mapping) 構造体として型キャストし、そのメンバーの 1 つを設定するにはどうすればよいでしょうか? 次に、「FILES_GetMemoryMapping」を2回目に呼び出したときに、この構造体を使用できるように、あまりうまくいっていないことを確認してください??
-- わかりました、私はいくつかのアドバイスを受けて、今これを持っています:
これを試してみたところ、最初の「FILES_GetMemoryMapping」呼び出しで「AccessViolationException was unhandled」例外が発生しました
ここに私が持っているものがあります:
この例外は「pMapping」パラメーターから来ていると思いますか? これは、私が渡した他の何かに由来する可能性がありますか?
c# - C#で構造体の配列をマーシャリングする方法は?
私はC#で次の構造を持っています:
これらの構造体の配列(固定長)をネイティブコードに渡す必要があります。ネイティブコードは、これらの構造体にデータを書き込みます。配列はC#で割り当てられ、Cdllに渡されます。インポートした関数を次のように宣言しました。
しかし、私はデータを取り戻しません。私はすでにPInvokeInteropAssistantを試しました。ここでIntPtrを使用する必要がありますか?何か案は?
編集:
ネイティブ関数を呼び出すためのC#コードは次のとおりです。
C関数は次のとおりです。
memory - 誰かが Marshal.StructureToPtr を説明できますか
このコードに問題があります:
ここで混乱します。コードをステップ実行して、最後の関数 (pElement が指すメモリ内のビットを変更する必要があります) を呼び出した後、oElement が変更されたことを確認します!? Marshal.StructureToPtr は、管理された構造体からメモリにデータを「コピー」すると思いました。では、2 つの場所は実際には同じでしょうか。管理された構造体 oElement と、pElement が指す割り当てられたメモリ?
serialization - シリアル化とマーシャリングの違いは何ですか?
いくつかの分散技術(RPCなど)の観点から、「マーシャリング」という用語が使用されていることは知っていますが、シリアル化との違いがわかりません。どちらもオブジェクトを一連のビットに変換していませんか?
関連している:
c# - C++ から C# への参照型のマーシャリング
次の C++ 関数 (DLL によってエクスポートされたもの) を C# から呼び出したいと考えています。
C++ から C# へのプリミティブのマーシャリングに関するドキュメントを見つけましたが、VmLoader や OptionList (どちらもクラス) などの参照型または非プリミティブ型を処理する方法がわかりません。C++ API を C# レイヤーでラップし、実際のメソッド実装のために基になる C++ コードに委譲しようとしています。
何か案は?
c# - C++ DLL から ac# プログラムに std::string を返す -> RtlFreeHeap に指定された無効なアドレス
C++ DLL の関数で、std::string を C# アプリケーションに返しています。次のようになります。
しかし、私の C# コードがこの関数を呼び出すと、出力ウィンドウに次のメッセージが表示されます。
C# での関数宣言は次のようになります。
私がオンラインで見つけたものから、削除で使用されている新しいバージョン (デバッグまたはリリースなど) の間に矛盾がある場合に、このメッセージが表示されることがあります。しかし、それが私の場合に起こっていることであるかどうかはわかりません。そのため、何が原因なのか正確にはわかりません。たぶん、MashallAs はそれと何か関係があるのでしょうか?
何か案は?
ありがとう!
c# - C dll コードを C# にマーシャリングする
dll に次の C コード署名があります。
C 関数は、w、h、enc、lp、mp、および ep を変更できます (ただし、後者の 3 つは null になる可能性があり、何もしません。
私はC#で以下を使用しています
SystemAccessViolation が発生していますが、いつ問題が発生するのか完全にはわかりません。
casting - マーシャリングとキャスト。それらは関連していますか?
先週、若い学生が私にマーシャリングはキャスティングと同じかどうか尋ねました。私の答えは間違いなくノーでした。マーシャリングはシリアル化であり、オブジェクトのメモリ表現をネットワークに送信するためにバイトに変換する方法ですが、キャストは型変換/強制に関連しています。
後で、マーシャリングはキャストの特殊なケースと見なすことができると考えた質問を再考しました。たとえば、メモリ表現の変換が xml にある場合、その xml ファイルの対応する xsd 文法によって定義された型に「キャスト」していると言えます。
これについてあなたはどう思いますか?