| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- using System;
- using System.Diagnostics;
- using System.Globalization;
- using System.Reflection;
- namespace WinSCP
- {
- internal class Callstack : IDisposable
- {
- public Callstack(Logger logger)
- {
- _logger = logger;
- if (_logger.Logging)
- {
- Type type = GetType();
- StackTrace stackTrace = new StackTrace();
- int i = 0;
- MethodBase method;
- do
- {
- StackFrame frame = stackTrace.GetFrame(i);
- method = frame.GetMethod();
- if ((method.IsConstructor && method.DeclaringType.IsAssignableFrom(type)) ||
- ((method.MemberType == MemberTypes.Method) && ((MethodInfo)method).ReturnType.IsAssignableFrom(type)))
- {
- method = null;
- }
- else
- {
- break;
- }
- i++;
- }
- while (i < stackTrace.FrameCount);
- if (method != null)
- {
- _name = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", method.DeclaringType.Name, method.Name);
- _logger.WriteLine("{0} entering", _name);
- _logger.Indent();
- }
- }
- }
- public virtual void Dispose()
- {
- if (_name != null)
- {
- _logger.Unindent();
- _logger.WriteLine("{0} leaving", _name);
- }
- }
- private readonly Logger _logger;
- private readonly string _name;
- }
- }
|