There старый вопрос, спрашивающий, собирается ли С# JIT каждый раз, и ответ знаменитого Jon Skeet: "нет, он скомпилирован только один раз за приложение" как долго поскольку мы говорим о настольных приложениях, которые не являются NGENed.
Я хочу знать, является ли эта информация с 2009 года по-прежнему истинным, и я хочу понять это путем эксперимента и отладки, потенциально, поставив точку останова на JITter и используя команды WinDbg для проверки объектов и методов.
Мои исследования пока
Я знаю, что макет памяти .NET рассматривает заголовок (по адресу А-4) и таблицу методов (по адресу А + 0) на объект до начала фактических данных (по адресу А + 4). Поэтому было бы возможно, что каждый объект имеет другую таблицу методов и, следовательно, может иметь разные JIT-методы.
Почему у меня возникают сомнения в правильности утверждения?
У нас был семинар для параллельного программирования, и одним из требований тренера было то, что методы JITted для каждого объекта на поток. Это явно не имело смысла для меня, и я смог написать пример приложения-счетчика.
К сожалению, появились следующие темы, для которых я также хочу написать демонстрацию:
- новые платформы .NET
- области приложений
- безопасность доступа к коду
Связанный ответ был написан, когда был выпущен .NET 3.5. С тех пор он существенно не изменился, то есть он не получил обновлений для .NET 4.0, 4.6 и 4.6.
Что касается доменов приложений, мое личное мнение заключается в том, что я могу выгрузить домен приложения, который выгружает сборки. Если сборка выгружена, она ушла, и код IL идет с ней. Я не вижу большой пользы в сохранении собственного кода для IL-кода, который был уничтожен. Поэтому я мог представить, что создание домена приложения и загрузка сборки снова может привести к повторному запуску метода.
Что касается безопасности доступа к коду, я не уверен, что он рассматривается компилятором JIT на основе текущих разрешений или выполняется ли это во время выполнения. Если это будет сделано компилятором JIT, скомпилированный код будет отличаться в зависимости от набора разрешений.