/// <summary> /// Creates a SARIF StackFrame instance from a .NET StackFrame instance /// </summary> /// <param name="stackTrace"></param> /// <returns></returns> public static StackFrame Create(System.Diagnostics.StackFrame dotNetStackFrame) { // This value is -1 if not present int ilOffset = dotNetStackFrame.GetILOffset(); string fileName = dotNetStackFrame.GetFileName(); int nativeOffset = dotNetStackFrame.GetNativeOffset(); MethodBase methodBase = dotNetStackFrame.GetMethod(); Assembly assembly = methodBase?.DeclaringType.Assembly; string fullyQualifiedName = CreateFullyQualifiedName(methodBase); StackFrame stackFrame = new StackFrame { Module = assembly?.GetName().Name, FullyQualifiedLogicalName = fullyQualifiedName }; if (fileName != null) { stackFrame.Uri = new Uri(fileName); stackFrame.Line = dotNetStackFrame.GetFileLineNumber(); stackFrame.Column = dotNetStackFrame.GetFileColumnNumber(); } if (ilOffset != -1) { stackFrame.Offset = ilOffset; } if (nativeOffset != -1) { stackFrame.SetProperty("NativeOffset", nativeOffset.ToString(CultureInfo.InvariantCulture)); } return stackFrame; }
/// <summary> /// Creates a <see cref="StackTrace"/> from the .NET system <see cref="System.Diagnostics.StackFrame"/> /// </summary> /// <param name="stackFrame"></param> /// <returns></returns> public static StackFrame Create(System.Diagnostics.StackFrame stackFrame) { MethodBase method = stackFrame.GetMethod(); Type declaringType = method.DeclaringType; // can be null for auto-generated expression trees string fullName = declaringType != null ? declaringType.FullName : null; return new StackFrame { ColumnNumber = stackFrame.GetFileColumnNumber(), FilePath = TryGetFileName(stackFrame), LineNumber = stackFrame.GetFileLineNumber(), ILOffset = stackFrame.GetILOffset(), MethodName = method.ToString(), TypeName = fullName }; }