Я наблюдал много «интроспективного» кода в приложениях, которые часто неявно полагаются на их содержащие методы , а не , чтобы их правильность была встроена. Такие методы обычно включают вызовы:
MethodBase.GetCurrentMethod
Assembly.GetCallingAssembly
Assembly.GetExecutingAssembly
Теперь я нахожу информацию, касающуюся этих методов, очень запутанной. Я слышал, что во время выполнения не будет встроен метод, вызывающий GetCurrentMethod, но я не могу найти никакой документации по этому поводу. Я несколько раз видел сообщения на StackOverflow, например этот , указывает, что среда CLR не встраивает вызовы кросс-сборки, но документация GetCallingAssembly
категорически указывает на обратное.
Существует также сильно критикуемый [MethodImpl (MethodImplOptions.NoInlining)]
, но я не уверен, считает ли CLR это «запросом» или «командой».
Обратите внимание, что я спрашиваю о встраивании правомочности с точки зрения контракта, не о том, когда текущие реализации JITter отказываются рассматривать методы из-за трудностей реализации, или о том, когда JITter, наконец, завершает выбор для встраивания подходящего метода после оценки компромиссов. Я прочитал это и это , но они, кажется, больше сосредоточены на последних двух пунктах (есть случайные упоминания MethodImpOptions.NoInlining и «экзотических инструкций IL», но они, кажется, представлены как эвристика, а не как обязательства ).
Когда CLR разрешено встроить?