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