У меня сложилась уникальная ситуация. Я работаю над библиотекой с открытым исходным кодом для отправки электронной почты. В этой библиотеке мне нужен надежный способ получить метод вызова. Я сделал это с помощью StackTrace
путем анализа объектов StackFrame
внутри него. Это работает без проблем в проекте debug-mode, где оптимизация отключена.
Проблема возникает, когда я переключаюсь в режим выпуска, в котором включены оптимизации. Трассировка стека выглядит так:
> 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
...
Это берется из отказа unit test. В строке 3 этой трассы я должен увидеть метод под названием TestEmail
, который определен в другом месте, но я считаю, что JITter вставляет его. Я прочитал, что вы можете предотвратить inlining, сделав метод виртуальным, но это не сработает. Кто-нибудь знает о надежном методе предотвращения внедрения метода, чтобы ваш метод обнаруживался в трассировке стека?