При выполнении приложения в .net 4.0, скомпилировано в .net 2.0 - PullRequest
20 голосов
/ 03 августа 2011

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

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

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

Описание

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

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

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

Источник

C # исходный код

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>

1 Ответ

38 голосов
/ 06 августа 2011

Суть в том, что в вашем сценарии вы указали .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, доступный в качестве среды выполнения.

...