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