Суть в том, что в вашем сценарии вы указали .Net 4 в качестве единственной поддерживаемой среды выполнения, поэтому ваше приложение будет загружаться с CLR 4.
Поведение CLR в вашей программе точно соответствует заданному:
Когда я запускаю ваше тестовое приложение с supportedRuntime
как v4.0, Process Explorer показывает, что оно загружает mscorlib v4.0.30319.
Когда я запускаю с supportedRuntime
как v2.0.50727, ProcessExplorer показывает, что загружает mscorlilb v2.0.50727.
Когда я запускаю без элемента supportedRuntime
, Process Explorer показывает, что он загружает mscorlilb v2.0.50727.
Эта реклама от Microsoft утверждает, что элемент supportedRuntime
определяет конкретную версию, в которой работает ваша программа:
По умолчанию приложение запускается в той версии .NET Framework, для которой оно было создано.Если эта версия отсутствует и файл конфигурации приложения не определяет поддерживаемые версии, может произойти ошибка инициализации .NET Framework.В этом случае попытка запустить приложение не удастся.
Чтобы определить конкретные версии, в которых работает ваше приложение, добавьте один или несколько элементов в файл конфигурации вашего приложения.Каждый элемент перечисляет поддерживаемую версию среды выполнения, причем первый указывает наиболее предпочтительную версию, а последний - наименее предпочтительную версию.
Здесь есть два отдельных элемента.К вашему сценарию применяется только элемент supportedRuntime
.
Элемент supportedRuntime
определяет версии CLR, в которых будет работать ваше приложение, в предпочтительном порядке.Если вы перечислите поддерживаемые среды выполнения, то будут использоваться эти версии CLR, двигаясь по списку сверху вниз, пока не будет найдена установленная версия CLR.Если вы не укажете поддержку времени выполнения, ваша программа будет работать с версией CLR, для которой она была скомпилирована.
Элемент useLegacyV2RuntimeActivationPolicy
применяется только к сборкам смешанного режима - программам или библиотекам DLL, которые содержат управляемый (.Net) и неуправляемый (собственный) код.Ваша программа-пример не является сборкой в смешанном режиме.Для сборок в смешанном режиме установка значения false
(по умолчанию) или не установка всего этого использует новую параллельную загрузку .Net 4 для сборок в смешанном режиме, чтобы ваше приложение могло работатьс CLR 4 и загрузите сборку смешанного режима в том же процессе, используя CLR 1.0-2.0.Установка этого параметра на true
по существу возвращает к предыдущей функциональности до .Net 4, где параллельная функциональность внутри процесса отключена, и независимо от того, какая версия CLR выбрана для запуска, приложение будет пытаться загрузить ваш смешанный режим.сборка.Версия CLR, используемая для загрузки сборки в смешанном режиме, будет зависеть от того, какая из них выбрана для запуска приложения, в зависимости от того, какая версия использовалась для компиляции приложения, и от списка поддерживаемых сред выполнения, если таковые имеются.
Есть статья MSDN Magazine и статья MSDN о загрузке .Net 4 и параллельном выполнении In-Proc SxS для компонентов COM, которая также имеетвлияние на ваш сценарий без компонентов COM.До .Net 4, если вы скомпилировали свое приложение с версией CLR, и эта версия не была доступна в системе во время выполнения, приложение автоматически запускалось на более новой версии CLR, если оно было установлено.Начиная с .Net 4, приложения теперь не будут работать с более новой версией CLR, если вы не укажете более новую версию в элементе supportedRuntimes
.
Вот цитата из статьи MSDN:
Разработчики приложений. Параллельный хостинг практически не влияет на разработчиков приложений.По умолчанию приложения всегда работают с версией .NET Framework, на которой они были созданы;это не изменилось.Однако разработчики могут переопределить это поведение и настроить приложение для запуска под более новой версией .NET Framework (см. Сценарий 2).
Разработчики и потребители библиотек. Параллельное размещение не решает проблем совместимости, с которыми сталкиваются разработчики библиотек.Библиотека, которая непосредственно загружается приложением - либо через прямую ссылку, либо через вызов Assembly.Load - продолжает использовать среду выполнения домена приложения, в которое оно загружено.Вам следует проверить свои библиотеки на всех версиях .NET Framework, которые вы хотите поддерживать.Если приложение скомпилировано с использованием среды выполнения .NET Framework 4, но содержит библиотеку, созданную с использованием более ранней среды выполнения, эта библиотека также будет использовать среду выполнения .NET Framework 4.Однако если у вас есть приложение, созданное с использованием более ранней среды выполнения, и библиотека, созданная с использованием .NET Framework 4, вы должны заставить свое приложение также использовать .NET Framework 4 (см. Сценарий 3).1055 *
Наконец, если вы работаете в Vista, Win7, Server 2008, Server 2008 R2, , у вас автоматически устанавливается CLR 2.0 .Таким образом, если вы удалите элемент supportedRuntimes
или измените его на v2.0.50727, у вас все еще может быть CLR 2.0, доступный в качестве среды выполнения.