2012-07-03 37 views
1

考慮以下情形:分配IronPython的方法C#的委託,此方法將整個應用程序域傳遞

AppDoamin 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.

這種方法是給serializati因爲appDomain2中的委託使用來自堆棧的變量。

可能的解決方案: 傳遞從IronPython的腳本委託方法在appDomain2方法被傳遞,因爲它是在Appdomain3。

問題: 如何做到這一點?直到現在還無法在此搜索任何內容。

注意:使用.NET Framework 2和ironpython 2.7.1。

P.S.對不起格式不好!

+0

該方案在跨應用程序域時沒有使用IronPython嗎? – leppie

+0

我無法做到這一點與Ironpython涉及,但從在.Net中創建的AppDoamin3發送委託方法工作正常。如果只涉及C#,則問題歸結爲不在委託內使用堆棧變量,即僅使用局部變量。 – Mahori

+0

謝謝。我理解這個問題。關閉的變量不可序列化。不知道如何解決這個問題。我能想到的唯一選擇是爲委託創建可遠程包裝。 – leppie

回答

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; 
    } 
} 
+1

正如我所說,一個遠程包裝:)很高興你找到你的解決方案。 – leppie