Возможно ли в VBScript определить имя функции, выполняемой в настоящее время?VBScript определяет, какая функция запущена
В .NET, вы можете сделать:
MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);
Возможно ли в VBScript определить имя функции, выполняемой в настоящее время?VBScript определяет, какая функция запущена
В .NET, вы можете сделать:
MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);
Нет, но вы можете легко реализовать его
dim module_name
sub sub1
module_name = "sub1"
wscript.echo "i'm " & module_name
'do something
end sub
function function1
module_name = "function1"
wscript.echo "i'm " & module_name
function1 = "something"
end function
В случае рекурсии можно также вспомнить you'r уровень, так чтобы вы можете выйти, если будете слишком глубоки.
В прошлом я создаю средство просмотра вызова, чтобы увидеть производительность каждой вызываемой функции. Это требует дополнительной строки кода VBS для каждой функции/суб и некоторых накладных расходов во время выполнения, конечно, из-за дополнительного кода.
снизу - вверх:
Function DoSomething(a, b, c)
dim registerFunctionObj : Set registerFunctionObj = [new RegisterFunction]("DoSomething")
' other code
End Function
Всякий раз, когда функция вызывается, она создает новый экземпляр объекта RegisterFunction. Когда функция выходит, переменная registerFunctionObj
автоматически выходит за пределы области видимости, вызывая подкласс Class_Terminate экземпляра.
[new RegisterFunction]
просто функция, которая возвращает экземпляр registerFunction:
Function [new RegisterFunction](funcName)
Set [new RegisterFunction] = new cls_RegisterFunction
[new RegisterFunction].FunctionName = funcName
Set [new RegisterFunction].CallStackViewer = CallStackViewer
End function
Class cls_RegisterFunction
Private functionName_, startTime_, callStackViewer_, endTime_
Private Sub Class_Initialize
startTime_ = now
callStackViewer_.LogInitialize me
End Sub
Public Property Let FunctionName(fName)
functionName_ = fName
End Property
Public Property Set CallStackViewer(byRef csv)
Set callStackViewer_ = csv
End Property
Private Sub Class_Terminate
endTime_ = now
callStackViewer_.LogTerminate me
End Sub
End Class
Экземпляр CallStackViewer одноэлементно экземпляр класса CallStackViewer, но вы можете сделать его частью вашего проекта, поэтому получить его через вас глобальный класс проекта:
Private PRIV_callStackViewer
Public Function CallStackViewer()
If not IsObject(PRIV_callStackViewer) Then
Set PRIV_callStackViewer = new cls_CallStackViewer
End If
Set CallStackViewer = PRIV_callStackViewer
End Function
Class cls_CallStackViewer
Public Sub Class_Initialize
' Here you can retrieve all function libraries (as text file) extract the
' function name, the file they are in and the linenumber
' Put them in a dictionary or a custom object
End Sub
Public Sub LogInitialize(byref registerFunction)
' Here you can push the function on a stack (use a standard dotnet list>stack for it),
' log the starttime to a log object or handle custom breakpoints
End Sub
Public Sub LogTerminate(byref registerFunction)
' Here you can pop the function from a stack, log the endtime to a log
' object or handle custom breakpoints
End Sub
End Class
Отказ от ответственности: код здесь чисто демонстрационный код, созданный на лету. Он не имеет функциональности и только здесь, чтобы объяснить концепцию. Он может содержать ошибки и не является полным.
Единственное, что вам нужно - это одна строка кода для каждой функции и ваше собственное воображение, чтобы расширить ее.
, это интересно, мне нужно будет это проверить ... – coson
не совсем то, что я искал. Я ищу что-то программно. – coson
Я знаю, давно смотрел на linenumber you'r, но также не возможно, это только сейчас, когда я пишу скрипты в Ruby, что у меня такая роскошь – peter