簡體   English   中英

與代表進行遠程處理

[英]Remoting with delegates

在我們的一個應用程序中,我們有一個(現有)接口,如下所示:

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

現在,我們想使用IpcChannels為實現此接口的對象實現一個“遠程處理層”。
我閱讀了許多有關遠程處理,委托和事件的文章,但是無法使測試場景正常工作。 大多數示例使用直接在服務器類中實現的事件,而不是參數中的委托。
有人知道一個有效的例子或給我提示嗎?

通過創建一個“EventSink的”,用表達lambda表達式重新創建的委托成功了 似乎有點復雜,但可以正常工作...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM