У меня какая-то уникальная ситуация. Я работал над библиотекой с открытым исходным кодом для отправки электронной почты. В этой библиотеке мне нужен надежный способ получить вызывающий метод. Я сделал это с StackTrace
, проанализировав StackFrame
объекты внутри него. Это работает без проблем в проекте в режиме отладки, где оптимизации отключены.
Проблема возникает, когда я переключаюсь в режим разблокировки, когда оптимизация включена. Трассировка стека выглядит следующим образом:
> FindActionName at offset 66 in file:line:column <filename unknown>:0:0
> Email at offset 296 in file:line:column <filename unknown>:0:0
> CallingEmailFromRealControllerShouldFindMailersActionName at offset 184
in file:line:column <filename unknown>:0:0
> _InvokeMethodFast at offset 0 in file:line:column <filename unknown>:0:0
> InvokeMethodFast at offset 152 in file:line:column <filename unknown>:0:0
...
Это взято из неудачного юнит-теста. В строке 3 этой трассировки я должен увидеть метод с именем TestEmail
, который определен в другом месте, но я считаю, что JITter его встроил. Я читал, что вы можете предотвратить встраивание, сделав метод виртуальным, но это не работает. Кто-нибудь знает надежный метод предотвращения встраивания метода, чтобы ваш метод отображался в трассировке стека?