問題タブ [safehandle]
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# - FileStream.SafeFileHandle を使用した後、GC.KeepAlive() の呼び出しを削除しても安全ですか?
最近使用するように変更した次のコードを検討してくださいFileStream.SafeFileHandle
。
Windows API呼び出しが返さGC.KeepAlive(fs)
れるまで FileStream がガベージ コレクションされないようにするために、以前に を追加していました。WriteFile()
ただし、SafeFileHandle
コード分析を使用するように変更した後、次の場合は不要であることがわかりましたwarning CA2004: Remove calls to GC.KeepAlive
。
SafeHandle の使用法に変換する場合は、GC.KeepAlive (オブジェクト) へのすべての呼び出しを削除します。
のドキュメントを参照しましたFileStream.SafeFileHandle
が、 への呼び出しを削除しても本当に安全かどうかは不明ですGC.KeepAlive()
。
削除しても安全ですか?そして、私はそれを正しく使用していますか?
また、SafeHandle の使用に関する適切なドキュメントを教えてくれる人はいますか?
c# - SafeHandle の invalidHandleValue の目的は何ですか?
SafeHandle
コンストラクinvalidHandleValue
ターは. IsInvalid
とにかく実装する必要がある場合、それは何に使用されますかどのメンバ変数がポインタを保持しているかがわからないため[メンバー変数が実装されているとは知りませんでしたhandle
]?
f# - F# で SafeHandles を使用する
プラットフォーム呼び出しを使用する F# コードを使用しています。私が使用している API の 1 つは、ハンドルを返します。を使用する代わりにnativeint
、独自の SafeHandle (具体的にSafeHandleMinusOneIsInvalid
は .) を実装しました。これにより、pinvoke 署名を含むモジュールの操作が少し面倒になります。次に例を示します。
モジュールとクラスが相互に再帰的に参照するため、これはコンパイルされません。これは機能しません。モジュールを上に移動するMySafeHandle
とGetHandle
、SafeHandle が表示されません。
MySafeHandle
F# の extern メソッドはモジュール内にある必要があるように見えるため、プラットフォーム呼び出しメソッドを内部に移動することはできません(コンパイラーはそれらをクラスに入れようとするのを止めませんが)。
また、F# の再帰型は、モジュールとクラスの間では機能せず、クラスの間では機能しないようです。
2 つの異なるモジュールを宣言する必要のないこの問題の解決策はありますか? 理想的には、すべてのプラットフォーム呼び出しコードを 1 つのモジュールにまとめたいと考えています。
c# - pinvoke/アンマネージ コードを適切に破棄する方法
ac dll を pinvoke する必要があるコードがあります。このコードは、アンマネージ コードに触れるため、idisposible を実装する必要があるように思えます。間違っているかもしれないので、間違っていたら訂正してください。
内容を読んでみると、セーフハンドルを使用する必要があるようです。偉大な。私のdllがハンドルまたはintptrを返さないことを除いて。んで、どうする?
署名は主に次のようなものです。
引数の値:
pTripID: 新しい Trip ハンドルが配置される 4 バイト整数へのポインター
そこにセーフハンドルを押し込む方法はありますか?この記事の難しいケースのようです。
c# - Win32 構造体 (PROCESS_INFORMATION) をマーシャリングするときのセーフ ハンドル
SafeHandle
通常のIntPtr
ハンドルの代わりにクラスを使用するように Win32 p/invoke コードを変換中です。
メソッド シグネチャではすべてがうまく機能しますDllImport
が、Win32 構造体 (つまり ) をマーシャリングするときにそれらを機能させることはできませんPROCESS_INFORMATION
。
ProcessSafeHandle
とクラスはまたはのThreadSafeHandle
ようなメソッドで問題なく動作しますが、上記のような Win32 構造体では使用できません。ReadProcessMemory
WriteProcessMemory
ある種の注釈マジックが欠けていますか?