2

AppDomain と Windows のメッセージにも関連する問題があります。

.Net WinForms UserControl 派生コントロール - HelloWorldCtl を含む、Internet Explorer でホストされる Web ページ。このコントロールは、C# で記述されたアセンブリ (HelloWorldControl.dll) 内にあります。コントロールは、C++/CLR で記述された別のアセンブリ (HelloWorldLibCPP.dll) のコードを使用します。

HelloWorldCtl は、HelloWorldLibCPP.dll をロードし、Win32 ネイティブ ウィンドウを作成するコードを呼び出して、そのウィンドウを HelloWorldCtl の領域に配置します。

Web ページに移動すると、HelloWorldCtl が読み込まれ、HelloWorldCtl の領域の中央にネイティブ ウィンドウが表示されます。

C# コントロールとネイティブ ウィンドウの両方にいくつかのメッセージ ハンドラーがあり、メッセージはすべて正常に機能しており、C# コントロールのウィンドウとネイティブ ウィンドウの両方に到達しています。マウス クリック、再描画など... ただし、ネイティブ ウィンドウの一部のメッセージ ハンドラーは、ネイティブ ウィンドウの親である C# コントロールのメソッドを呼び出す必要があります。これは、C# コントロールが実装し、ネイティブ ウィンドウが (System::Runtime::InteropServices から) GCHandle に格納することで参照を保持するインターフェイスを使用して行われます。GCHandle には gcroot<> テンプレートを使用しました。

この時点で、ネイティブ ウィンドウのコードが GCHandle を使用して C# コントロールのメソッドを呼び出そうとすると、エラーが発生します。(c++ コードは、/clr を使用してマネージ コードとしてコンパイルされます)。

スローされる例外は次のとおりです。

「AppDomain 間で GCHandle を渡すことはできません」

C# とネイティブ ウィンドウの両方で CurrentDomain の Id と FriendName を表示するためのデバッグ コードをいくつか入れたところ、これらの AppDomains が同じではないことがわかりました。

ネイティブ ウィンドウの作成中、CurrentDomain は C# コントロールのものと同じですが、ネイティブ ウィンドウがメッセージを受信し、それらのメッセージが処理されると、CurrentDomain は C# コントロールのものとは異なります。

この状況を変えることはできますか?両方のネイティブ ウィンドウ メッセージ ハンドラを C# コントロールと同じ AppDomain で実行することは可能ですか?

おそらく他の提案はありますか?

ありがとう、ロジャー

4

1 に答える 1

1

私は実際に問題の問題の解決策を実際に見つけました。「AppDomains全体のアンマネージドコールバック」という件名のブログ「Miralityからの思考、Mirality SystemsでのMiralからのランダムな思考と思索」の次の投稿で説明されているのと同様の方法で、コードを正常に実装しました。

幸運、ロジャー

http://lambert.geek.nz/2007/05/29/unmanaged-appdomain-callback/

于 2010-07-06T17:05:42.600 に答える