1

次のシナリオを検討してください。

アプリケーション ドメイン 1:

public delegate bool Delegate1(class1 c1,string p);

 class class1
  {
    public bool method1(Delegate1 d, out IEnumerable<string> partNumbers)
      {
      //Method body
       }
    }

AppDoamin2:

class x
 {
  public bool method2(Dictionary<string,string> x,out string[] returnValues)
   {
    class1Instance.method1(delegate(class1 cc,string pp){if(x.Key=="blaah") return False;},out temp);

    }
  }

IronPython スクリプト: メソッド 2 を呼び出します。

このアプローチは、appDomain2 のデリゲートがスタックの変数を使用しているため、シリアライゼーションの例外を与えています。

可能な解決策: デリゲート メソッドを ironpython スクリプトから appDomain2 のメソッドに渡し、Appdomain3 にそのまま渡します。

問題:これを行う方法は?これまで何も検索できませんでした。

注: .NET Framework 2 および ironpython 2.7.1 が使用されます。

PS 書式設定が不十分で申し訳ありません。

4

1 に答える 1

1

答えを見つけました。よくあることですが、答えは甘くてシンプルです。

そのため、デリゲートの実装全体、メンバー変数などをカプセル化する小さなヘルパー クラスを作成しました。このクラスのコンストラクターは、必要なパラメーターを受け取ります (デリゲートをシリアル化できないという問題を引き起こしていました)。以下は、私が書いた小さなヘルパー クラスです。

public sealed class DevCatalogFilterHelper : MarshalByRefObject
{
    Dictionary<string, string> m_resourceNameValuePair;

    public DevCatalogFilterHelper(Dictionary<string, string> resourceNameValuePair)
    {
        this.m_resourceNameValuePair = resourceNameValuePair;
    }

    public  bool FilterDelegate(class1 devCat,string partNumber)
    {
        foreach (KeyValuePair<string, string> kvp in m_resourceNameValuePair)
        {
            string value;
           //if(condition){helpFull code return false;}
        }
        return true;
    }
}
于 2012-07-11T11:44:04.287 に答える