将ironpython方法分配给C#委托,此方法将跨appDomains传递

将ironpython方法分配给C#委托,此方法将跨appDomains传递,c#,delegates,ironpython,appdomain,C#,Delegates,Ironpython,Appdomain,考虑以下场景: AppDoAdmin 1: public delegate bool Delegate1(class1 c1,string p); class class1 { public bool method1(Delegate1 d, out IEnumerable<string> partNumbers) { //Method body } } 公共委托bool Delegate1(类别c1,字符串p); 一班

考虑以下场景:

AppDoAdmin 1:

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

 class class1
  {
    public bool method1(Delegate1 d, out IEnumerable<string> partNumbers)
      {
      //Method body
       }
    }
公共委托bool Delegate1(类别c1,字符串p);
一班
{
公共布尔方法1(委托1 d,输出IEnumerable零件号)
{
//方法体
}
}
AppDoAdmin2:

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);

    }
  }
x类
{
公共布尔方法2(字典x,输出字符串[]返回值)
{
method1(委托(class1cc,字符串pp){if(x.Key==“blaah”)返回False;},out temp);
}
}
IronPython脚本: 调用方法2

当appDomain2中的委托使用堆栈中的变量时,这种方法会给出序列化异常

可能的解决办法: 将委托方法从ironpython脚本传递到appDomain2中的方法,该方法在Appdomain3中的传递方式相同

问题: 如何做到这一点?到目前为止,我们还不能在这上面搜索任何东西

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


另外,很抱歉格式不好

找到了答案。通常情况下,答案是甜蜜而简单的

因此创建了一个小的helper类,它封装了整个委托实现、成员变量等。这个类的构造函数接受必要的参数(这导致无法序列化委托的问题)-

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;
    }
}
公共密封类DevCatalogFilterHelper:MarshallByRefObject
{
字典m_resourceNameValuePair;
公共DevCatalogFilterHelper(字典资源名称值对)
{
this.m_resourceNameValuePair=resourceNameValuePair;
}
公共布尔过滤器delegate(class1 devCat,字符串零件号)
{
foreach(m_resourceNameValuePair中的KeyValuePair kvp)
{
字符串值;
//如果(条件){helpFull代码返回false;}
}
返回true;
}
}

找到了答案。通常情况下,答案是甜蜜而简单的

因此创建了一个小的helper类,它封装了整个委托实现、成员变量等。这个类的构造函数接受必要的参数(这导致无法序列化委托的问题)-

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;
    }
}
公共密封类DevCatalogFilterHelper:MarshallByRefObject
{
字典m_resourceNameValuePair;
公共DevCatalogFilterHelper(字典资源名称值对)
{
this.m_resourceNameValuePair=resourceNameValuePair;
}
公共布尔过滤器delegate(class1 devCat,字符串零件号)
{
foreach(m_resourceNameValuePair中的KeyValuePair kvp)
{
字符串值;
//如果(条件){helpFull代码返回false;}
}
返回true;
}
}

在应用程序域中没有IronPython的情况下,该场景是否可以工作?我无法使用IronPython完成此操作,但从.Net中创建的AppDoAdmin3发送委托方法效果良好。若只涉及C#,那个么问题就归结为不在委托中使用堆栈变量,即只使用局部变量。谢谢。我理解这个问题。闭合变量不可序列化。我不知道如何解决这个问题。我能想到的唯一选项是为委托创建一个远程包装器。没有IronPython跨应用程序域的情况下,该场景是否可以工作?涉及IronPython的情况下,我无法做到这一点,但从.Net中创建的AppDoAdmin3发送委托方法很好。若只涉及C#,那个么问题就归结为不在委托中使用堆栈变量,即只使用局部变量。谢谢。我理解这个问题。闭合变量不可序列化。我不知道如何解决这个问题。我能想到的唯一选项是为委托创建远程包装。正如我所说,远程包装:)很高兴您找到了解决方案。正如我所说,远程包装:)很高兴您找到了解决方案。