Como relançar a exceção interna de uma TargetInvocationException sem perder o rastreamento de pilha

Eu tenho muitos métodos que estão chamando usandoDelegate.DynamicInvoke. Alguns desses métodos fazem chamadas ao banco de dados e eu gostaria de ter a capacidade de capturar umSqlException e não pegar oTargetInvocationException e vasculhe suas entranhas para descobrir o que realmente deu errado.

Eu estava usando esse método para retroceder, mas ele limpa o rastreamento de pilha:

 try
 {
      return myDelegate.DynamicInvoke(args);
 }
 catch(TargetInvocationException ex)
 {
     Func<TargetInvocationException, Exception> getInner = null;
     getInner =
        delegate(TargetInvocationException e)
        {
        if (e.InnerException is TargetInvocationException)
            return getInner((TargetInvocationException) e.InnerException);

         return e.InnerException;
        };

     Exception inner = getInner(ex);
     inner.PreserveStackTrace();
     throw inner;
 }

oPreserveStackTrace O método é um método de extensão que eu consertei graças a outro post (não sei o que ele realmente faz). No entanto, isso também não parece preservar o rastreamento:

public static void PreserveStackTrace(this Exception e)
{
    var ctx = new StreamingContext(StreamingContextStates.CrossAppDomain);
    var mgr = new ObjectManager(null, ctx);
    var si = new SerializationInfo(e.GetType(), new FormatterConverter());

    e.GetObjectData(si, ctx);
    mgr.RegisterObject(e, 1, si);
    mgr.DoFixups(); 
}

questionAnswers(3)

yourAnswerToTheQuestion