Предотвращение JIT-встраивания в метод

У меня уникальная ситуация. Я работал над библиотекой с открытым исходным кодом для отправки электронной почты. В этой библиотеке мне нужен надежный способ получить вызывающий метод. Я' Мы сделали это с помощью 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 встраивает его. Я читал, что вы можете предотвратить вложение, сделав метод виртуальным, но это не работает. Кто-нибудь знает надежный метод предотвращения встраивания методов, чтобы ваш метод отображался в трассировке стека?

28
задан Scott Anderson 2 March 2011 в 14:58
поделиться