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