【问题标题】:VB.NET Tracing VariablesVB.NET 跟踪变量
【发布时间】:2009-02-09 18:50:07
【问题描述】:

我正在为我公司的 VB.NET 项目开发一种跟踪日志记录的方法。 .NET 框架具有非常通用的跟踪功能,我想使用 .NET 已经提供的功能。我的公司希望远离 3rd 方软件,所以 log4net 和诸如此类的东西是不可能的。

他们希望能够跟踪 Web 应用程序的流程,并且使用跟踪源、侦听器和开关将使这部分变得非常容易。但是,他们希望我跟踪整个程序中的变量何时发生变化,而不必在计算中每隔一行编写 Trace.Write("i = " & i)。

那么,有什么有效的方法可以做到这一点?

感谢您的回答。提前致谢。


我决定去上课。我只是创建了一个具有 IntegerChanged 事件的 TraceVariable 类。这样,代码其他部分的开发人员将能够控制如何处理变量更改,如果他想做一些事情而不是跟踪它。

代码如下:

Public Class TraceVariable  
    Private mInteger As Integer  
    Public Event IntegerChanged(ByVal mInteger As Integer)  
    Public Property TraceInteger() As Integer
        Get
            TraceInteger = mInteger
        End Get
        Set(ByVal value As Integer)
            mInteger = value
            RaiseEvent IntegerChanged(mInteger)
        End Set
    End Property
End Class

感谢您的回答!至于这很混乱,我们只会将它用于关键变量,所以不用担心。追踪我们的情况是必要的,也是一种安全预防措施。

【问题讨论】:

    标签: asp.net vb.net logging trace


    【解决方案1】:

    跟踪每一个变量的变化很快就会变得混乱,并导致除了最微不足道的应用程序之外的任何应用程序的信息过载。

    如果您想要跟踪特定变量的更改,请将它们包装在一个简单的自滚动 Traceable 类中,并在执行更新时将其写入 Trace。

    【讨论】:

      【解决方案2】:

      如果您谈论的是 int、double 等原始变量,那么这将很难,但是如果您需要跟踪对自定义类的访问,那么您需要做的就是在您的属性设置器和方法中放置一些跟踪语句修改状态(mutators)。

      现在对于原始类型,我尝试使用某种 AOP 工具(如 postsharp)来修补这些原始类型的 IL 代码(突变器)以发出跟踪消息,就像您对用户定义的类所做的一样。

      【讨论】:

        【解决方案3】:

        在变量变化时进行跟踪似乎非常极端......它可能会很慢。

        我不知道框架中内置的任何东西可以做到这一点。从本质上讲,它更接近于分析或调试而不是跟踪。

        【讨论】:

          【解决方案4】:

          您可能想尝试以下方法(警告 => C#):

              class Program
          {
              static void Main(string[] args)
              {
                  test(1, "one");
                  test(2, "two");
                  test(3, "three");
                  Console.ReadLine();
              }
          
              private static void test(int x, string y)
              {
                  DisplayParameterNameAndValue(() => x);
                  DisplayParameterNameAndValue(() => y);
              }
          
          
              static void DisplayParameterNameAndValue(Expression<Func<object>> parameter)
              {
                  var expressionBody = parameter.Body;
                  MemberExpression memberExpression;
                  if (expressionBody is UnaryExpression)
                  {
                      memberExpression = (MemberExpression)((UnaryExpression)expressionBody).Operand;
                  }
                  else if (expressionBody is MemberExpression)
                  {
                      memberExpression = (MemberExpression)expressionBody;
                  }
                  else
                  {
                      throw new ArgumentException("parameter");
                  }
                  string parameterName = memberExpression.Member.Name;
                  object parameterValue = parameter.Compile().Invoke();
                  Console.WriteLine("{0} => {1}", parameterName, parameterValue);
              }
          }
          

          VB 中的等效代码是:

          Module Module1
          
          Sub Main()
              test(1, "one")
              test(2, "two")
              test(3, "three")
              Console.ReadLine()
          End Sub
          Private Sub test(ByVal x As Integer, ByVal y As String)
              DisplayParameterNameAndValue(Function() x)
              DisplayParameterNameAndValue(Function() y)
          End Sub
          
          
          Private Sub DisplayParameterNameAndValue(ByVal parameter As Expression(Of Func(Of Object)))
              Dim expressionBody = parameter.Body
              Dim memberExpression As MemberExpression
              If TypeOf expressionBody Is UnaryExpression Then
                  memberExpression = DirectCast(DirectCast(expressionBody, UnaryExpression).Operand, MemberExpression)
              ElseIf TypeOf expressionBody Is MemberExpression Then
                  memberExpression = DirectCast(expressionBody, MemberExpression)
              Else
                  Throw New ArgumentException("parameter")
              End If
              Dim parameterName As String = memberExpression.Member.Name
              Dim parameterValue As Object = parameter.Compile().Invoke()
              Console.WriteLine("{0} => {1}", parameterName, parameterValue)
            End Sub
          End Module
          

          我已经测试过了,但它给我的结果与 c# 不同,糟糕的 vb!

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2015-05-24
            • 1970-01-01
            • 2014-09-20
            • 2015-11-15
            • 1970-01-01
            • 2017-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多