Вы можете обнаружить его во время выполнения с помощью вышеупомянутого вызова GetCurrentMethod. Но это, похоже, пустая трата [1]. Самое простое, что можно сделать, - это просто ИДАДАСИТЬ MSIL и проверить там.
Обратите внимание, что это специально для компилятора , встроенного в вызов, и рассматривается в различных документах Reflection на MSDN.
Если метод, вызывающий метод GetCallingAssembly, расширяется встроенным компилятором (т. Е. Если компилятор вставляет тело функции в промежуточный язык Microsoft (MSIL), а не в вызов функции), то сборка возвращается методом GetCallingAssembly - это сборка, содержащая встроенный код. Это может отличаться от сборки, содержащей оригинальный метод. Чтобы убедиться, что метод, который вызывает метод GetCallingAssembly, не встроен компилятором, вы можете применить атрибут MethodImplAttribute с MethodImplOptions.NoInlining.
Тем не менее, JITter также свободен для встроенных вызовов - но я думаю, что дизассемблер будет единственным способом проверить, что и что не делается на этом уровне.
Редактировать: просто чтобы устранить некоторую путаницу в этой теме, csc.exe будет встроенными вызовами MSIL - хотя JITter будет (вероятно) более агрессивным в этом. *
[1] И, под отходами - я имею в виду, что (а) он отрицает цель включения (лучшую производительность) из-за поиска в отражении. И (б), это, вероятно, изменит поведение встраивания, так что оно больше не будет встроенным. И, прежде чем думать, что вы можете просто включить его в сборках Debug с Assert или чем-то еще - поймите, что он не будет встроен во время Debug, но может быть в Release.