In questo articolo di Dino spiega come far comunicare tra loro l'ambiente host e il runtime di Worflow Foundation.
L' articolo è un pò datato (ad esempio l'attributo [DataExchangeService] nella RTM è diventato [ExternalDataExchange]) ma comunque ottimo dal punto di vista didattico.
Stavo facendo qualche prova con una banalissima interfaccia IMyData

[ExternalDataExchange]
public interface IMyData {
  event EventHandler NewDataAvailable;
  void SendSomeData (string data);
  string Data { get;set; }
}

e la relativa implementazione:

public class MyData:IMyData {
  public event EventHandler NewDataAvailable;
  private string mData;

  public void SendSomeData (string data){...}

  public void SendDataToWorkFlow (string data) {
  if (NewDataAvailable != null) {
     NewDataAvailable(this, new MyCustomDataEventArgs(ID, data));
  }
  }
}

quando scopro che l'invocazione di SendDataToWorkFlow() fallisce con errore: "Event NewDataAvailable cannot be delivered", analizzando l'InnerException scopro che il motivo è legato alla serializzazione degli argomenti e nello specifico del parametro sender smile_whatchutalkingabout che a quanto pare deve essere anch'esso serializzabile, infatti marcando con [Serializable] la classe MyData tutto si risolve.
Non essendo sempre possibile garantire la classe che implementa il contratto possa essere serializzabile, un alternativa diffusa pare essere quella di impostare il parametro sender a null.

public void SendDataToWorkFlow (string data) {
  if (NewDataAvailable != null) {
     NewDataAvailable(null, new MyCustomDataEventArgs(ID, data));
  }