- PR -

ASP.NETでエラー Cannot pass a GCHandle across AppDomains

1
投稿者投稿内容
hiro-ta
ベテラン
会議室デビュー日: 2003/09/03
投稿数: 79
投稿日時: 2006-07-06 11:33
いつもお世話になっております。
マネージドC++を使って混合DLLを作成しテストしたところ、コマンドラインでの実行は問題なく動作するのですが、ASP.NETでは次のようなエラーになりました。
Cannot pass a GCHandle across AppDomains

原因はある程度判明しています。
このプログラムはマネージコード側で作ったクラス(マネージオブジェクトをgcrootでメンバに持つ)のインスタンスをネイティブコードに渡してネイティブ側でマネージオブジェクトを操作するような仕組みになっておりそこまでは良いのですが、問題はネイティブ側がマルチスレッドで動いていてサブスレッドでマネージオブジェクトを操作しにいくところにあるようです。
ネイティブ側でスレッドが変わるとマネージ側のAppDomainが違うものになってしまい、AppDomain間でハンドルの受け渡しができないためこのようなエラーになっているものと思われます。
ネイティブ側をマルチスレッドにしなければ今回のエラーは発生しないのですが、マルチスレッドを止めることは都合上どうしてもできません。なにか良い回避方法はないでしょうか?

プログラムの流れは以下のような感じです。以下のプログラムは分かりやすくするためにかなり簡略化しています。
厳密に見るとおかしい部分が多々ありますがあくまで全体の流れをご理解いただきたいが為のものですのでどうかご容赦ください。

[マネージ側]
class ManClass
{
gcroot<Stream*> m_stream;
int read() { m_stream->read(); }
};

hogehoge()
{
ManClass man;
NativeClass::execute(&man);
}

[ネイティブ側]
subthreadA(ManClass *pman)
{
pman->read();
}

class NativeClass
{
static void execute(ManClass* pman) {
subthreadAをマルチスレッド起動
}
};
1

スキルアップ/キャリアアップ(JOB@IT)