Проверка метода встраивания в C # - PullRequest
9 голосов
/ 21 марта 2011

Можно ли как-нибудь проверить (не форсировать), встроен ли данный метод или метод получения свойства в сборку выпуска?

Ответы [ 6 ]

7 голосов
/ 21 марта 2011

Нет - потому что это не происходит во время сборки; это происходит во время JIT. Компилятор C # не выполняет никаких вставок; это до CLR, что код в конечном итоге работает.

Вы можете обнаружить это с помощью cordbg со всеми включенными JIT-оптимизациями, но вам придется копаться в коде сборки. Я не знаю ни одного способа обнаружить это в коде. (Возможно, вы могли бы сделать это с помощью API отладчика, хотя это вполне может отключить некоторые встраивания для начала.)

5 голосов
/ 21 марта 2011

Они никогда не вставляются компилятором C #.Только const поля.

Вы можете взглянуть на оптимизацию компилятора C # здесь .

Вы можете убедиться, что методили свойство accessor имеет значение never , в которое встроен данный атрибут:

[MethodImpl(MethodImplOptions.NoInlining)]
3 голосов
/ 21 марта 2011

Вы должны посмотреть на машинный код.Установите точку останова для вызова метода, а когда он попадет, щелкните правой кнопкой мыши и выберите «Перейти к сборке».Если вы не видите оператор CALL, он становится встроенным.Вы должны быть в состоянии немного ускорить чтение машинного кода, чтобы быть уверенным, что вы можете увидеть вызов в встроенном методе.

Чтобы сделать это точным, вам придется использоватьИнструменты + Опции, Отладка, Общие, снимите флажок «Подавить оптимизацию JIT при загрузке модуля».Благодаря этому джиттер работает так же, как и без отладчика, методы не будут встроены при выключенном оптимизаторе.

1 голос
/ 03 апреля 2018

Я знаю, что этот пост довольно старый, но вы можете просто распечатать стопку, в которой вы вызываете функцию, и в самой функции, которую вы вызываете.

Если распечатанная стопка совпадает, вы можете быть уверены, чтофункция была встроенной.

Чтобы распечатать стопку, вы можете использовать System.Environment.StackTrace или переменные VS $caller и $callstack (https://msdn.microsoft.com/en-us/library/5557y8b4.aspx#BKMK_Print_to_the_Output_window_with_tracepoints)

1 голос
/ 21 марта 2011

Добавьте код в тело метода для проверки трассировки стека, используя StackFrame. По моему опыту, встроенные методы исключены из этой трассировки стека.

0 голосов
/ 24 мая 2012

Это возможно, не глядя на код сборки:

http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/jit-etw-tracing-in-net-framework-4.aspx

...