Захват состояния метода с помощью Reflection - PullRequest
5 голосов
/ 03 октября 2008

Есть ли способ использовать .NET отражение для захвата значений всех параметров / локальных переменных?

Ответы [ 6 ]

3 голосов
/ 03 октября 2008

Вы можете получить эту информацию, используя API отладки CLR , хотя для ее извлечения потребуется не просто пара строк.

2 голосов
/ 03 октября 2008

Отражение не используется для сбора информации из стека. Это читает Ассамблею.

Возможно, вы захотите взглянуть на StackTrace

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

Хорошая статья здесь:

http://www.codeproject.com/KB/trace/customtracelistener.aspx

1 голос
/ 03 октября 2008

Reflection сообщит вам тип параметров, которые есть у метода, но не поможет обнаружить их значения во время какого-либо конкретного вызова. Отражение вообще ничего вам не говорит о локальных переменных.

Вам нужны API-интерфейсы, которые отладчик использует для доступа к такой информации.

0 голосов
/ 23 ноября 2009

Люди на secondlife приостанавливают скрипты и перемещают их между серверами. Это означает, что они должны фиксировать состояние работающего скрипта, включая значения переменных в стеке вызовов.

Их язык сценариев работает на моно, реализации с открытым исходным кодом .NET Runtime. Я сомневаюсь, что их решение применимо к обычной среде выполнения .NET, но видео презентации о том, как они это сделали (переходите ко второй половине), все еще может быть интересным.

0 голосов
/ 03 октября 2008

Я не знаю, как это возможно с помощью отражения, но посмотрите на использование ткачества. SpringFramework.Net позволяет вам определять точки, которые могут перехватывать вызовы методов. Другие, вероятно, тоже так делают.

Вот ссылка на перехватчик BeforeAdvice http://www.springframework.net/docs/1.2.0-M1/reference/html/aop.html#d0e8139

0 голосов
/ 03 октября 2008

Я не думаю, что это возможно, вы можете получить метод и его параметры, посмотрев на StackTrace.

System.Diagnostics.StackTrace sTrace = new System.Diagnostics.StackTrace(true);
for (Int32 frameCount = 0; frameCount < sTrace.FrameCount; frameCount++){ 
     System.Diagnostics.StackFrame sFrame = sTrace.GetFrame(frameCount);
     System.Reflection.MethodBase thisMethod = sFrame.GetMethod();
     if (thisMethod == currentMethod){
          if (frameCount + 1 <= sTrace.FrameCount){
               System.Diagnostics.StackFrame prevFrame = sTrace.GetFrame(frameCount + 1);
               System.Reflection.MethodBase prevMethod = prevFrame.GetMethod();
          }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...