Pivotal Knowledge Base

フォローする

Native Client .NET アプリケーションで「AppDomain 間で GCHandle を渡すことはできません」というエラーが発生

環境 

 製品  バージョン
 Pivotal GemFire Native Client  任意のバージョン

概要

本記事では、Windows 環境においてNative Client .NET アプリケーションで「AppDomain 間で GCHandle を渡すことはできません」というエラーが発生し処理に失敗する場合の解決策を提供する。 

事象

単一 .NET アプリケーションプロセス内で複数の AppDomain を生成するような場合、以下のようなエラーが発生する。このエラーは、ASP.NET アプリケーションにおいて、開発者が明示的に複数の AppDomain を生成しなくても、各 Web アプリケーションに対して個別に AppDomain を自動生成するため、IIS との組み合わせで発生することが多い。

クライアント側のログメッセージ:

gemfire::Exception: GFCLI_EXCEPTION:System.ArgumentException: AppDomain 間で GCHandle を渡すことはできません。

原因

Native Client キャッシュインスタンスは、稼働対象となる .NET アプリケーションプロセスが複数 AppDomain を保持していても、当該プロセス内においては 1 つだけ生成される。このため、複数 AppDomain からのキャッシュへのアクセスが競合する可能性がある。言い換えれば、Native Client モジュールは、Native Client API をコールする特定 AppDomain による単一タスクを、当該 AppDomain だけで実行すべきなのに、全ての AppDomain で実行しようとする。

解決策

以下のように、プロパティーファイルや API を用い、appdomain-enabled=true と設定する。

プロパティーファイル(デフォルトで、gfcpp.properties):

appdomain-enabled=true

API(C# の場合):

Properties<string, string> prp = Properties<string, string>.Create<string, string>();
prp.Insert("appdomain-enabled", "true");
  :
CacheFactory cacheFactory = CacheFactory.CreateCacheFactory(prp);
  :
Cache cache = cacheFactory.Create();

 

コメント

Powered by Zendesk