Хорошо, вот сделка.
Вы не можете сделать это, не из управляемого языка. Я не понимаю, как кто-то позволит вам взять под контроль стековый фрейм. И таким образом, это то, что вы хотите. Потому что вам нужна информация, чтобы получить значения.
Теперь среда выполнения знает об этом, у нее есть вся информация, но вы не можете делать предположения о том, как это будет происходить при создании стекового фрейма, потому что вы не должны этого делать.
Ergo, есть только один способ сделать это. API профилирования.
Я в конечном итоге здесь . В рамках функций профилирования API. Могу поспорить, что есть способ сделать это, что позволяет вам копаться в значениях параметров, вызывая неуправляемый класс из управляемого кода.
Теперь я бы не стал этого делать, потому что уже есть отличные инструменты для профилирования, JetBrains dotTrace, чтобы назвать его одним, а с IntelliTrace в VS2010 все эти головные боли просто исчезнут ... IntelliTrace позволит вам выполнять отладку во время путешествий.
Другой и очевидный способ сделать это - полностью foobar, но может оказаться забавным поэкспериментировать с ним, это всегда можно сделать таким образом, но я бы никогда в жизни не использовал этот код в производственной среде.
// compile with unsafe
unsafe
{
var p = stackalloc int[1];
var baseAddr = p - sizeof(int);
}
Теперь вы не можете писать на baseAddr
, но вам должно быть разрешено читать его. Сложность состоит в том, чтобы разобраться со стековыми кадрами, и это имеет отношение к соглашению о вызовах, и это вы должны знать наверняка. Вот разброс этого материала, и это быстрый звонок.
С этой информацией и объектами ParameterInfo вы сможете пройтись по аргументам.
Поскольку вы будете работать с необработанными указателями, вам нужно превратить их в управляемые объекты, и для этого есть класс .
Ну вот, иди с ума!
Большое предупреждение, хотя , то, что вы найдете, поднимаясь по стеку, не будет тем, что вы ожидаете. Поскольку аргументы могут быть помещены в регистры, а регистры не могут быть доступны из управляемого кода.