1

ほとんどの場合、firefox/xulrunner を C# アプリケーションに正常に埋め込むことができましたが、問題がないわけではありません。まれに AccessViolationException がスローされます。これは、GC がメモリ内のマネージド オブジェクトを移動し、アンマネージド xpcom が移動後にそれを使用しようとしたことが原因であると考えられます。たとえば、firefox/xulrunner が呼び出すいくつかのインターフェイスを実装するカスタム プロトコル用のプロトコル ハンドラを作成しました。それを行った後、AccessViolationException がはるかに優勢になりました。考えられる解決策として GCHandle.Alloc(object, GCHandleType.Pinned) を調べましたが、カスタム マーシャラーを記述してインターフェイスを実装するクラスを "blittable" にする方法に関する十分な情報が見つかりませんでした。それで、この問題に対処する方法や、私のクラスを「ブリット可能な」クラスに変換する方法について、誰かアイデアがありますか? また、相互運用のどの部分が AccessViolationException を引き起こしているのかを追跡することはほぼ不可能です。うーん:-(

洞察をありがとう!

4

1 に答える 1

2

「GetComInterfaceForObject はオブジェクトを固定しますか?」という別の質問を通じて、これに対する答えがあると思います。. 基本的に私が信じているのは、AccessViolationExceptions であり、.net 側でスコープ外に出たオブジェクトによって生成されます。私の理解が正しければ、アンマネージ参照はマネージ オブジェクトを存続させません。そのため、アンマネージ コードが呼び出すことができるように長期間存在する必要がある私が作成したマネージ オブジェクトは、フィールドまたはリストのいずれかに格納されるようになりました。また、「blittable」オブジェクトの側では、クラスを固定する方法が見つかりませんでしたが、インターフェースを実装した構造体を固定する方法をなんとか見つけました。このインターフェイスは、MarshalAs 属性が定義された相互運用インターフェイスであり、アンマネージ コードへの変換が可能であったため、明らかにオブジェクトの固定が可能でした。

:-)

于 2009-06-30T21:36:17.390 に答える