VB.NET追踪变量

3

我正在为我们公司的VB.NET项目设计一种跟踪记录日志的方法。.NET框架具有非常灵活的跟踪能力,我想使用.NET已经提供的功能。由于公司希望避免使用第三方软件,因此log4net等软件不在考虑范围内。

他们希望能够跟踪Web应用程序的流程,使用跟踪源、监听器和开关将使这部分变得非常容易。但是,他们希望我能够跟踪程序中变量的更改,而不必在计算的每一行中写入Trace.Write("i = " & i)。

那么,有没有高效的方法来实现这一点呢?

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


我的决定是创建一个类。我简单地制作了一个TraceVariable类,其中包含一个IntegerChanged事件。这样,其他代码开发人员就能够控制如何处理变量更改,如果他想要做一些其他操作而不只是跟踪它。

以下是代码:

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个回答

2

跟踪每个变量的变化会很快变得混乱,并且只有最简单的应用程序才能承受信息过载。

如果您想跟踪特定的变量更改,请将它们放入一个简单的自定义Traceable类中,并使用访问器在更新时写入到Trace。


0

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

现在对于原始类型,你可以尝试使用某种AOP工具(如postsharp)来修补这些原始类型的IL代码(mutators),以发出与用户定义类相同的跟踪消息。


0

追踪变量更改似乎相当极端...这可能会很慢。

我不知道框架中是否有任何内置功能可以实现此操作。本质上,它更接近于分析或调试而不是追踪。


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太差了!

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接