問題タブ [unmanaged-memory]
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# - C# でアンマネージ メモリを処理する
次のように、C# でネイティブ C++ dll を使用しています。
C++ 関数:
C# では、次のことを行っています。
(これは unsafe ブロックと fixed ブロックを適切に使用して行われているため、心配する必要はありません)
からデータを印刷するとf2
、一部のデータが破損し、ガベージ値が表示されます。そして、いくつかの値は正しいです。私が知りたいのは、それを void ポインターに保存するためptr
ですか? それともそれでいいのですか、理由は別のものですか?
c# - 2 つの異なる GCHandle がメモリ内の同じ配列を参照しています
何が起こっているのかわからないので、これはおそらく適切に表現された質問ではありません。私は学ぼうとしていますが、これについて何らかの方向性が得られることを願っています。初心者に対するあなたの忍耐に感謝します。
変更中のコードがあります。画像を表示します。画像を変更して、別のウィンドウに表示したい。画像を表示するコードをコピーして変更を行うと、元の画像と変更された画像の両方に対して変更された画像が表示されます。
GCHandle が同じメモリを参照し続けているようですか? ハンドル名を変更して、本当に新しいハンドルを作成していませんか? 長いコードで申し訳ありませんが、私は迷っています。
何がうまくいかないのですか?
最も困惑しているのは、それが機能していたということです。その後、何かを変更しましたが、現在は機能するバージョンに戻ることができません。私のコードは機能していたものと同じだと思います。いくつかの設定はどこですか?
c# - C# ライブラリと C++ (CLR) の間でオブジェクトを渡す
C# ライブラリから C++ にオブジェクトを渡す方法。
返す関数を問題なく呼び出すことができvoid
ますint
。
C# で次の関数を考えてみましょう。
私のC#クラスには、
さて、このリストを C++ で使用したいと思います。だから私は作成しました、
それは正しい方法ですか?? C ++で使用する必要があるものではない場合?
c# - C# での WinDivert
C# コードで 5 つの WinDivert 関数を呼び出したいのですが、最初の反射: PInvoke のシグネチャは次のとおりです。
87 = ERROR_INVALID_PARAMETER
への呼び出しで ( )、( 998 = ERROR_NOACCESS
) エラーを回避することができましたがWinDivertOpen()
、WinDivertClose()
を呼び出そうとすると、まだWinDivertRecv()
取得されます。System.AccessViolationException : Attempted to read or write protected memory. This is often an indication that other memory has been corrupted
(998 = ERROR_NOACCESS)
WinDivertHelperParsePacket()
コードは次のとおりです。
私の上司は、マーシャリングとメモリ処理の苦痛を避けるために、C 呼び出しをラップして C# に公開する C++ で COM オブジェクトを作成する方が良い/簡単だと言いました。PInvoke に固執する必要がありますか、それとも COM の方法を使用する必要がありますか?
編集:更新
アンマネージ メモリを割り当てる 2 つの異なる方法を試しましたが、どちらも失敗しました (安全でないコードが許可されています)。
と :
また、ループ内で WinDivRecv が LastWin32Error で失敗することもあります。6 = INVALID_HANDLE_VALUE
これは、GC がハンドルをいじっているためですか? 試しGC.KeepAlive(handle)
てみましたが、何も変わりませんでした。
C++\CLI ラッパー : (アンマネージド C DLL とマネージド C# コード間のブリッジ)
[以下のコメントで推奨されるオプション]
私は次の手順に従いました:
- C++/CLI ライブラリ プロジェクトを作成する
- C 関数をラップするネイティブ C++ クラスを作成する
- ネイティブ クラス インスタンスを指すフィールドを持つマネージド C++/CLI クラスを作成し、すべてのアンマネージド メソッドをラップして、必要なマーシャリングを行います。
- ==> をビルドしようとすると、有名な LNK2019 および LNK2028 で失敗します
WinDivert DLL を参照として追加するか、WinDivert.h のみを追加する必要がありますか? カーネル ドライバーの .sys ファイルはどうですか? 正直なところ、PInvoke よりも簡単ではありませんが、さらに悪いことに、blittable でないデータ型と struct/enum 定義の同じマーシャリングを行う必要があります。
windows - Windbg !heap -s コマンドと !heap -stat コマンドの出力が一致しない
メモリダンプがあります。このダンプには、ハンドル付きのヒープがありますfd00000
。!heap -s fd00000
これは、コマンドの出力からの抜粋です。
期待どおりに要約情報が表示されていることがわかります。しかし、出力は!heap -stat -h 0fd00000
次のようになります。
すべて 16 進数なので、ここから「総ビジー バイト数」が 205 MB を超えていることがわかります。つまり、このヒープには 80 MB/60 MB の予約済み/仮想メモリがあることがわかりますが、このヒープは 205 MB を占有していることがわかります。!heap -s
!heap -stat
不一致は非常に大きいです。これはどのように可能ですか?実行する!heap -s
と、次のような複数のエントリが表示されます。
多分これが理由ですか?
c# - 新しい画像が以前のビットマップに重なる
これについてはいくつかの投稿がありますが、私はまだそれを理解できません。私はこれでかなり新しいので、ご容赦ください。
画像を表示してから、新しい画像を取得して表示しようとします。新しい画像を表示すると、古い画像が残っています。私はPicture1.Image= null
無駄にしようとしました。
管理されたメモリの問題ですか?メモリの管理方法に関係していると思われます。何らかの方法で、コードが新しいイメージと古いイメージをコピーして、前のイメージのデータを残すようにしています。
データを表示するコードは次のとおりですscaled1
(この役立つ以前の投稿から)。
編集:
プロットされた配列の処理を示すコードが追加されました。メソッドを使用して配列をクリアすると、オーバーレイ動作が停止しますArray.Clear
。おそらく、これが解決されたら、問題を示す正規のスニペットを投稿できます。
これにより、「配列の各値が書き換えられるときに配列をクリアする必要があるのはなぜですか?」という疑問がリセットされます。配列は以前の値の情報をどのように保持できますか?
c# - ボクシングなしの Marshal.StructureToPtr
実際にボックス化せずに、構造体 (おそらくTypedReferenceに格納されている) をアンマネージ メモリにマーシャリングする方法はありますか? 構造体の型は実行時にわからないため、StructureToPtr (.NET 4.5.1) のジェネリック オーバーロードを使用できません。StructureToPtrオーバーロードの MethodInfo を取得できますが、ジェネリック参照またはTypedReferenceを渡して呼び出す方法はないようです。
編集:ジェネリックStructureToPtrはまだ構造をボックス化するため、それを呼び出そうとしても無駄です。
c# - C#.net からアンマネージ C/C++ でメモリを管理する方法は?
専門家のアドバイスが必要:
C/C++ 上にあるサードパーティ プロバイダーのアンマネージ コードがあり、C#.Net からラッパーを作成して、それぞれのメソッドを参照して使用しています。管理されておらず、メモリリークがあり、管理されていないコードがメモリを管理することがわかっていない場所がたくさんあるため、この種のシナリオに最適なソリューションは何ですか?
私は、PInvoke と Marshalling を使用したソリューションを持っています。これは、メモリ管理に関する知識を持って Managed と Unmanaged を橋渡しします。しかし、GC はこれを完全に処理しますか、それともメモリを解放する必要があるギャップがまだありますか? アンマネージド コールのメモリを管理する一般的な方法がある .Net ラッパー クラスからの解決策はありますか?
c# - c# から c++ を利用する
現在、「char ***myArray」を他の文字列比較方法よりもはるかに高速に処理する C++ コードがあります。
また、C++ を DLL にラップし、'DataTable' を使用する C# GUI から関数を呼び出しています。
「DataTable」データを「char ***myArray」に渡す方法に興味があります。
Interface.cs:
cppFunctions.cpp:
int、double、string、または単純な値を渡すと、問題なく動作します。
c# - アンマネージド DLL のファイル ストリームへのポインター
サードパーティのアンマネージ DLL があり、メモリの巨大な連続ブロック (約 500 MB) へのポインター (IntPtr を使用) を提供する必要があります。使用できるメモリの量を超えることはありませんが、エラーを発生させずに大きなメモリの連続ブロックを取得できないことはよくあります。このメモリ ブロックは単なるイメージ バッファであり、小さなブロックを提供しようとすると、すべてを消費する可能性は低いですが、それを消費するとクラッシュします。また、大量のメモリはデバイスがサポートする最大サイズですが、デバイスが常に必要とする量は、ユーザーがデバイスで何をしているかに基づいていることに注意してください。
サードパーティは、DLL に変更を加えることを望んでいません。私は、ファイル パスだけを取得し、DLL にデータをハード ドライブ上の生のファイルにダンプさせる意思があるかどうかを尋ねました。
とにかく、探しているものを言葉にする方法がわかりません。それが可能であるとは思えませんが、メモリの連続ブロックを指すのではなく、ファイルを指す IntPtr を渡す方法を探しています。ストリームまたはハード ドライブ上のファイルに直接送信されるもの。そのようなことは可能ですか?もしそうなら、どのような .Net 名前空間を調べる必要がありますか?