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 で実行することは可能ですか?
おそらく他の提案はありますか?
ありがとう、ロジャー