Подтвердить что ты не робот

При выполнении приложения на .net 4.0 выполняется в .net 2.0

Предполагая, что:

  • Исходный код С# ниже компилируется в .NET 2.0 (CLR 2.0); и
  • В приведенном выше приложении используется app.config, приведенный ниже; и
  • Только среда .NET 4.0 (CLR 4.0) установлена ​​в среде клиента, выполняющего приложение,

то какая версия .NET будет загружена изнутри для выполнения приложения в клиентской среде?

Описание

Консольное приложение ниже просто покажет, что его версия CLR v4.0.30319 в консоли, но ответ @Reed Copsey из стека (CLR 2.0 vs 4.0 performance?) показывает, что в этом случае загружается .NET 2.0. Более того, в MSDN говорится, что если useLegacyV2RuntimeActivationPolicy установлено в false false:

Используйте политику активации по умолчанию для .NET Framework 4 и более поздних версий, , что позволяет использовать устаревшие методы активации во время загрузки CLR версии 1.1 или 2.0.

Похоже, что .NET 2.0 загружен, несмотря на то, что app.config имеет конфигурацию .NET 4.0. Я что-то не понял?

Источник

Исходный код С#

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string version = Environment.Version.ToString();
            Console.WriteLine(version);
        }
    }
}

app.config

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="false">
        <supportedRuntime version="v4.0.30319"/>
    </startup>
</configuration>
4b9b3361

Ответ 1

Суть в том, что в вашем сценарии вы указали .Net 4 как единственное поддерживаемое время выполнения, поэтому ваше приложение загрузится с помощью CLR 4.

Поведение CLR с вашей программой в точности соответствует:

Когда я запускаю тестовое приложение с supportedRuntime как v4.0, Process Explorer показывает, что он загружает mscorlib v4.0.30319.

Когда я запускаю с supportedRuntime как v2.0.50727, Process Explorer показывает, что он загружает 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 и , вы автоматически устанавливаете CLR 2.0. Поэтому, если вы должны удалить свой элемент supportedRuntimes или изменить его на v2.0.50727, вы все равно можете использовать CLR 2.0 в качестве среды выполнения.

.Net runtimes