3

我正在研究一种方法来跟踪我公司的 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

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

4

4 回答 4

2

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

如果您想要跟踪特定变量的更改,请将它们包装在一个简单的自滚动 Traceable 类中,该类具有在您进行更新时写入 Trace 的访问器。

于 2009-02-09T18:58:39.807 回答
0

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

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

于 2009-02-09T18:55:15.773 回答
0

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

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

于 2009-02-09T18:56:00.623 回答
0

您可能想尝试以下方法(警告 => 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!

希望这可以帮助。

于 2009-02-09T19:11:32.553 回答