diff --git a/src/Ben.Demystifier/Ben.Demystifier.csproj b/src/Ben.Demystifier/Ben.Demystifier.csproj
index 5de05ba..fdce526 100644
--- a/src/Ben.Demystifier/Ben.Demystifier.csproj
+++ b/src/Ben.Demystifier/Ben.Demystifier.csproj
@@ -9,7 +9,7 @@
git
true
true
- 0.0.2
+ 0.0.3
diff --git a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs
index 4265d4b..968d637 100644
--- a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs
+++ b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs
@@ -59,8 +59,8 @@ namespace System.Diagnostics
var fileName = frame.GetFileName();
var row = frame.GetFileLineNumber();
var column = frame.GetFileColumnNumber();
-
- if (string.IsNullOrEmpty(fileName))
+ var ilOffset = frame.GetILOffset();
+ if (string.IsNullOrEmpty(fileName) && ilOffset >= 0)
{
// .NET Framework and older versions of mono don't support portable PDBs
// so we read it manually to get file name and line information
@@ -168,7 +168,20 @@ namespace System.Diagnostics
if (method is System.Reflection.MethodInfo mi)
{
- methodDisplayInfo.ReturnParameter = GetParameter(mi.ReturnParameter);
+ var returnParameter = mi.ReturnParameter;
+ if (returnParameter != null)
+ {
+ methodDisplayInfo.ReturnParameter = GetParameter(mi.ReturnParameter);
+ }
+ else if (mi.ReturnType != null)
+ {
+ methodDisplayInfo.ReturnParameter = new ResolvedParameter
+ {
+ Prefix = "",
+ Name = "",
+ Type = TypeNameHelper.GetTypeDisplayName(mi.ReturnType, fullName: false, includeGenericParameterNames: true).ToString(),
+ };
+ }
}
if (method.IsGenericMethod)
diff --git a/test/Ben.Demystifier.Test/DynamicCompilation.cs b/test/Ben.Demystifier.Test/DynamicCompilation.cs
new file mode 100644
index 0000000..81fa9a7
--- /dev/null
+++ b/test/Ben.Demystifier.Test/DynamicCompilation.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Diagnostics;
+using System.Linq.Expressions;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Demystify
+{
+ public class DynamicCompilation
+ {
+ [Fact]
+ public async Task DoesNotPreventStackTrace()
+ {
+ // Arrange
+ var expression = Expression.Throw(
+ Expression.New(
+ typeof(ArgumentException).GetConstructor(
+ new Type[] {typeof(string)}),
+ Expression.Constant( "Message")));
+
+ var lambda = Expression.Lambda(expression);
+
+ var action = lambda.Compile();
+
+ // Act
+ Exception demystifiedException = null;
+ try
+ {
+ await Task.Run(() => action()).ConfigureAwait(false);
+ }
+ catch(Exception ex)
+ {
+ demystifiedException = ex.Demystify();
+ }
+
+ // Assert
+ var stackTrace = demystifiedException.ToString();
+ stackTrace = ReplaceLineEndings.Replace(stackTrace, "");
+ var trace = stackTrace.Split(Environment.NewLine);
+
+ Assert.Equal(
+ new[] {
+ "System.ArgumentException: Message",
+ " at void lambda_method(Closure)",
+ " at Task Demystify.DynamicCompilation.DoesNotPreventThrowStackTrace()+()=>{}",
+ " at void System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, object state)",
+ " at async Task Demystify.DynamicCompilation.DoesNotPreventThrowStackTrace()"},
+ trace);
+ }
+
+ private Regex ReplaceLineEndings = new Regex(" in [^\n\r]+");
+ }
+}