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  che a quanto pare deve essere anch'esso serializzabile, infatti marcando con [Serializable] la classe MyData tutto si risolve.
 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));
  }