軽減策:アプリ ドメイン全体でのオブジェクトの逆シリアル化

場合によっては、アプリが異なるアプリケーション ベースを持つ複数のアプリ ドメインを使用すると、アプリ ドメイン間で論理呼び出しコンテキストのオブジェクトを逆シリアル化しようとして、例外がスローされます。

問題の診断

問題は、次の条件の順序で発生します。

  1. アプリケーションが異なるアプリケーション ベースを持つ複数のアプリ ドメインを使用します。

  2. 一部の型は、LogicalCallContextLogicalCallContext.SetData などのメソッドを呼び出して CallContext.LogicalSetData に明示的に追加されます。 これらの型は、シリアル化可能としてマークされず、グローバル アセンブリ キャッシュに格納されません。

  3. 後で、既定以外のアプリ ドメインで実行されているコードは、構成ファイルから値を読み取るか、XML を使用してオブジェクトを逆シリアル化しようとします。

  4. 構成ファイルから読み取るか、オブジェクトを逆シリアル化するために、XmlReader オブジェクトは構成システムにアクセスしようとします。

  5. 構成システムがまだ初期化されていないときは、初期化を完了する必要があります。 これは特に、ランタイムが次のように構成システムの固定のパスを作成する必要があることを意味します。

    1. これは既定以外のアプリ ドメインの証拠を検索します。

    2. 既定のアプリ ドメインに基づいて既定以外のアプリ ドメインの証拠を計算しようとします。

    3. 既定のアプリ ドメインの証拠を取得するための呼び出しは、既定以外のアプリ ドメインから既定のアプリ ドメインへのアプリ ドメイン間の呼び出しをトリガーします。

    4. .NET Framework のアプリ ドメイン間コントラクトの一部として、論理呼び出しコンテキストの内容も、アプリ ドメインの境界を越えてマーシャリングされる必要があります。

  6. 論理呼び出しコンテキストに含まれる型が既定のアプリ ドメインで解決できないため、例外がスローされます。

軽減策

この問題を回避するには、次を実行します

  1. 例外がスローされたときにコール スタックで get_Evidence の呼び出しを検索します。 この例外は、FileNotFoundExceptionSerializationException などの例外の大きなサブセットであることもあります。

  2. オブジェクトが論理呼び出しコンテキストに追加されないアプリ内の場所を特定して、次のコードを追加します。

    System.Configuration.ConfigurationManager.GetSection("system.xml/xmlReader");  
    

関連項目