Этот атрибут действует только в том случае, если вы предварительно компилируете свои сборки с помощью NGen , чтобы ускорить горячий запуск приложения.Когда вы указываете MultiDomain
или MultiDomainHost
, вы разрешаете использование предварительно скомпилированных (ngenned) сборок.Вы можете проверить это с помощью Process Explorer , где вы можете посмотреть список загруженных модулей.
Это один из самых больших способов экономии времени запуска, если ваше приложение состоит из нескольких исполняемых экземпляров, которые совместно используют сборки.Это позволяет .NET обмениваться кодовыми страницами между процессами, что, в свою очередь, экономит реальную память (одна сборка существует только один раз в физической памяти, но совместно используется одним или несколькими процессами) и предотвращает повторное повторение одного и того же кода JIT в каждом процессе.что требует времени за счет того, что сгенерированный код немного менее эффективен, чем это может быть, когда он будет скомпилирован с обычным JIT, который может использовать более динамические данные для генерации наиболее эффективного кода.
В вашем примере вы загружаете сборку в байтовый массив, который находится в управляемой куче и увеличивает количество ваших личных байтов.Это делает невозможным обмен данными между процессами.Только те страницы, которые доступны только для чтения и имеют аналог на жестком диске, могут быть разделены между процессами.Это причина, почему атрибут не имеет никакого эффекта.Если вы стремитесь к 2-му коэффициенту производительности «теплого» запуска, это атрибут, который вы искали.Для всего остального это не имеет значения.
Теперь вернемся к исходному вопросу:
- Он задан, но при запуске приложения под отладчиком этот атрибут
MultiDomain
игнорируется.Когда вы запустите его вне отладчика, вы получите ожидаемые результаты. - Да
MultiDomainHost
включает AppDomain
нейтральность только для подписанных сборок, все остальные не доступны. - Совместное использование кода можетпроизойдет только тогда, когда он предварительно скомпилирован.Реальный вопрос: как проверить, предварительно ли скомпилирована сборка?Я делаю это с Process Explorer , просматривая список загруженных модулей.Когда моя загруженная сборка отображается с путем к кэшу Native Image и расширением .ni, я уверен, что предварительно скомпилированное изображение используется.Вы также можете проверить это с помощью fuslogvw , когда вы установите переключатель в «Собственные изображения», чтобы проверить, почему собственные изображения не использовались во время выполнения.