Возможно ли, чтобы встраивание JIT встраивало мой код в некоторый код сборки среды выполнения .NET?

Я хотел бы понять, насколько повсеместным может быть встраивание JIT.

Предположим, в моем коде я вызываю некоторую функцию, скажем, из System.IO сборки и передаю ссылку обратного вызова на функцию, реализованную в моем коде, для вызова из этой System.IO функции. В моей функции есть GetCallingAssembly() вызов. Поэтому, если мой обратный вызов встроен в System.IO, вызов GetCallingAssembly(), который изначально был в моем коде и предназначался для того, чтобы сказать, что «текущий» метод вызывается изнутри System.IO, скажет, что теперь он вызывается внутри моего кода.

Возможно ли такое встраивание или сборки среды выполнения .NET обрабатываются по-разному, поэтому JIT-инлайнинг пользовательского кода в код среды выполнения .NET не разрешен?


person sharptooth    schedule 01.10.2012    source источник
comment
Как делегированный обратный вызов может быть встроен в callback-invoker? Я не уверен, что это имеет смысл...? Насколько я понимаю, встраивание ограничено сценариями, в которых вызываемый код является доказуемым, то есть статическим вызовом или виртуальным вызовом невиртуального метода.   -  person Marc Gravell    schedule 01.10.2012
comment
@Mark Gravel: Почему бы и нет, если известно, что это единственный вызов инициатора обратного вызова во всей программе?   -  person sharptooth    schedule 01.10.2012
comment
Я подозреваю, что для понимания требуется больше усилий, чем когда-либо будет делать JIT, особенно с учетом того, что существует рефлексия/метапрограммирование (имеется в виду: позже могут появиться новые вызывающие объекты)   -  person Marc Gravell    schedule 01.10.2012
comment
Могли бы вы выбрать более странный пример для сборки? Я собирался сказать, что его не существует, но потом обнаружил, что он действительно существует в версии 4.0, но, насколько я понимаю, он просто перенаправляет типы обратно в mscorlib — и до сих пор насколько мне известно, эти типы всегда существовали в mscorlib. Хм.   -  person Damien_The_Unbeliever    schedule 01.10.2012


Ответы (1)


Вы можете с уверенностью предположить, что обратный вызов не будет встроен. Сборки .NET Framework всегда предварительно компилируются с помощью ngen.exe во время установки, после чего нет возможности изменить этот код. Кроме того, обратные вызовы через делегата никогда не встраиваются, даже если оптимизатор дрожания может определить, каким может быть целевой метод делегата.

person Hans Passant    schedule 01.10.2012