"[Легкая функция]" в стеке вызовов
Я отлаживаю программу (VS2008), и я перебираю строки кода. Я наткнулся на одну строку, где вызывалась функция делегата, и я попытался войти в нее. Однако вместо того, чтобы входить в метод, как я ожидал, метод был обойден, а отладчик вместо этого перешел в то, что я предполагаю, - это функция, называемая делегатом. В стеке вызовов строка, в которой я ожидала, что метод делегата будет выделен серым цветом с текстом [Lightweight Function]
.
Что означает часть "Легкая функция"? Есть ли способ войти в эту функцию?
Ответы
Ответ 1
Я считаю, что легкая функция относится к DynamicMethod, то есть к той, которая испускается во время выполнения, используется, а затем выгружается.
Это сообщение в блоге связано с Iron Python, но информация должна быть хорошей для любого проекта .NET: Просмотр Испущенных Ил. Автор показывает вам, как использовать отладчик более низкого уровня (windbg.exe), чтобы увидеть эти "легкие функции".
Ответ 2
Похоже, это DynamicMethod. См. этот для некоторой проницательности.
Я не уверен в том, чтобы перейти к динамическому методу.
Ответ 3
Callstack для DynamicMethod (оба в режиме отладки и выпуска):
[Lightweight Function]
[Native to Managed Transition]
mscorlib.dll!System.Reflection.Emit.DynamicMethod.Invoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture) + 0x199 bytes
Чистый
[облегченная функция]
Кадр можно наблюдать, когда вызывается делегат для динамического метода.