【问题标题】:Remoting with delegates与代表进行远程处理
【发布时间】:2017-08-04 03:51:13
【问题描述】:

在我们的一个应用程序中,我们有一个(现有的)这样的接口:

public interface INotify
{
  void RegisterNotification(Action<int, string> notification);
}

现在我们要为实现此接口的对象使用 IpcChannels 实现“远程处理层”。
我阅读了许多关于远程处理、委托和事件的文章,但无法让测试场景正常工作。大多数示例使用直接在服务器类中实现的事件,而不是参数中的委托。
有人知道一个可行的例子或给我一个提示吗?

成功通过创建“EventSink”并使用表达式 lambda 重新创建委托。似乎有点复杂,但工作......

【问题讨论】:

  • 你在msdn中有一些例子,但是为什么你需要使用IPC?
  • 感谢您的提示。我们需要使用远程处理和 IPC,因为我们希望将 INativeHandleContract 用于远程创建的 wpf 控件,这些控件将在应用程序中使用(AddIn 机制)。

标签: c# delegates remoting


【解决方案1】:

EventSink:

public class GenericEventSink : MarshalByRefObject
{
  public event GenericDelegate MessageReceived;

  public Type OriginalType { get; }

  public GenericEventSink(Delegate original)
  {
    OriginalType = original.GetType();
    MessageReceived += objects =>
    {
      try
      {
        return original.DynamicInvoke(objects);
      }
      catch (Exception ex)
      {
        return null;
      }
    };
  }

  public override object InitializeLifetimeService()
  {
    return null;
  }

  public object OnMessageReceived0()
  {
    return MessageReceived?.Invoke();
  }
  public object OnMessageReceived1(object o1)
  {
    return MessageReceived?.Invoke(o1);
  }
  public object OnMessageReceived2(object o1, object o2)
  {
    return MessageReceived?.Invoke(o1, o2);
  }
  public object OnMessageReceived3(object o1, object o2, object o3)
  {
    return MessageReceived?.Invoke(o1, o2, o3);
  }
}

...以及重新创建要调用的委托的方法:

private object UnmarshalDelegate(GenericEventSink generic)
{
  var pars = generic.OriginalType.GenericTypeArguments.Select(Expression.Parameter).ToArray();

  // create the call
  var method = generic.GetType().GetMethod("OnMessageReceived" + pars.Length);
  var call = Expression.Call(Expression.Constant(generic), method, pars.Select(p => Expression.Convert(p, typeof(object))));
  return Expression.Lambda(generic.OriginalType, call, pars).Compile();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多