.Netとアンマネージdll - >メモリの問題

Visual Studio 2010でアンマネージDLLを作成しています。

私のDLLをテストするために、私はVisual Basicで別のプロジェクトを作成しました。私はそれをソリューションに付けました。

VBのコールバック関数のデリゲートをVBで渡して、DLLのInstallHook関数にVBコードを呼び出します。次に、DLLがフックを作成し、キーが押されるたびにVBコールバックが呼び出され、キーと他のいくつかのパラメータが引数として受け取られます。

問題は、いくつかのキーが押され、VBコールバックのバッファが特定のサイズに達すると、プログラムがクラッシュすることです。具体的には、コールバックが最後に呼び出され、VBでバッファに書き込まれるとき、次回コールバックがDLLで呼び出されるため、プログラムのクラッシュが到達せずにどこかで重複しているようですコールバック(DLL内のポインタは問題ありません)

私は.NETのアーキテクチャをよく理解していませんし、何が間違っているのか正確にはわかりませんが、私がやったコードには非常に自信があり、問題は.NETのメモリ管理で何か技術的なものにすべきです。

編集:私は、VBコード内からコールバックを呼び出すと、それはうまく動作すると言うことを忘れてしまった。コールバックは通常、同じウィンドウにインストールされたWndProcから呼び出されます。

ありがとう....

2

1 答え

dllのポインタは問題ありません

私はこれが問題だと思う。ネイティブルーチンにアドレスを渡して、単一のメソッド呼び出しの範囲を超えて使用すると、いくつかのリスクが発生します。

問題は、.NETが圧縮ガベージコレクタを使用していることです。これは、ランタイムがメソッド呼び出しの間に完全に異なる場所にバッファを「移動」させる可能性があることを意味します。したがって、ある時点で、あなたがそれに書き込むとき、それはまったく別の場所にある可能性があります。

この問題を回避するには、マーシャリングクラス。あるいは、 GCHandleクラスを使用してメモリを固定し、それができないようにすることができます移動します。

3
追加された
OK、問題が解決しました。これは、コールバックポインターを設定するDLL内のInstallHookと同じサブクラスでデリゲートをローカルで宣言していたために発生しました。デリゲートそれはそれを捨てて、DLLのクラッシュ....ちょうどVBコードのグローバルセクションに代理人を移動する問題を修正...ありがとうリードCopsey :)
追加された 著者 lqbweb,