Проблема с отражением сборки в режиме выпуска - PullRequest
0 голосов
/ 28 мая 2020

Я столкнулся со странным поведением, пытаясь получить родительскую сборку в каком-то классе ведения журнала (только когда он скомпилирован в режиме Release ).

In Debug режим работает как шарм:

StackFrame[] frames = new StackTrace().GetFrames();
var assemblies = (from f in frames
                  select f.GetMethod().ReflectedType.Assembly)
                  Distinct()
                  .Last();

Пример: сборка A => сборка B => метод

когда я запускаю указанный выше сценарий в режиме отладки, я получаю сборку A (как и ожидалось), но когда он запускается в режиме выпуска, я получаю: mscorlib вместо этого. но самое странное, что при проверке всего стека сборок нет ни одной ссылки на сборку A . как это возможно? что может происходить?

PS: сборка A - это проект webapp.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Мне удалось решить эту проблему. Я думаю, эта проблема связана с поведением компилятора в режиме выпуска. Я думаю, что это должно быть связано с встраиванием метода (даже когда я не могу быть уверен).

Я нашел эти условия, чтобы запретить JIT возможность встроить метод (из здесь ):

  • Методы, длина которых превышает 32 байта IL, не будут встроены.
  • Виртуальные функции не встроены.
  • Методы, которые у сложного управления потоком не будет встраиваться. Сложное управление потоком - это любое управление потоком, кроме if / then / else; в этом случае switch или while.
  • Методы, содержащие блоки обработки исключений, не встраиваются, хотя методы, генерирующие исключения, по-прежнему являются кандидатами для встраивания.
  • Если какой-либо из формальных аргументов метода является структуры, метод не будет встроен.

Я попробовал со всеми приведенными выше рекомендациями, но единственное, что сработало для меня, - это добавить параметр (необязательно) в мой метод, чтобы получить его больше 32 байтов.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 28 мая 2020

Я создал образец консольного приложения с именем consoleA и библиотеку классов с именем classB.

Он возвращает ConsoleA в обоих случаях. Я думаю, ваша проблема в том, что ваше приложение A является веб-приложением, и когда оно запущено другой службой, которой в данном случае является IIS, оно возвращает работающую службу, в которой размещено ваше приложение (сборка A).

...