Отслеживание VB.NET - PullRequest
       13

Отслеживание VB.NET

3 голосов
/ 09 февраля 2009

Я работаю над подходом к ведению журнала трассировки для проекта моей компании VB.NET. .NET Framework имеет довольно универсальные возможности трассировки, и я хотел бы использовать то, что уже предоставляет .NET Моя компания хочет держаться подальше от стороннего программного обеспечения, поэтому о log4net и многом другом не может быть и речи.

Они хотят иметь возможность отслеживать поток веб-приложений, а использование источников трассировки, слушателей и переключателей сделает эту часть довольно простой. Тем не менее, они хотят, чтобы я отслеживал, когда переменные изменяются во всей программе, без необходимости записывать 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 голосов
/ 09 февраля 2009

Отслеживание каждого изменения переменной быстро станет беспорядочным и приведет к информационной перегрузке для любого, кроме самого тривиального приложения.

Если есть конкретные переменные, в которых вы хотите отследить изменения, оберните их в простой самозакрученный класс Traceable с аксессорами, которые записывают в Trace при обновлении.

0 голосов
/ 09 февраля 2009

Вы можете попробовать следующее (предупреждение => 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!

Надеюсь, это поможет.

0 голосов
/ 09 февраля 2009

Трассировка, когда изменение переменных кажется довольно экстремальным ... вероятно, будет медленным.

Я не знаю ничего встроенного в структуру, которая делает это. По сути, это ближе к профилированию или отладке, чем к трассировке.

0 голосов
/ 09 февраля 2009

Если вы говорите о примитивных переменных, таких как int, double и т. Д., Это будет непросто, но если вам нужно проследить доступ к вашим пользовательским классам, тогда все, что вам нужно сделать, это поместить несколько операторов трассировки в ваши установщики свойств и методы, которые изменить состояние (мутаторы).

Теперь, что касается типов примитивов, вы можете попробовать использовать какой-то инструмент АОП (например, postsharp) для исправления кода IL (мутаторы) для этих типов примитивов, чтобы испускать сообщения трассировки, такие же, как вы могли бы сделать для пользовательского класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...