Как заставить приложение использовать .NET 3.5 или выше?

Наше приложение построено на VS 2008, использует Linq и имеет Target Framework, установленную в .NET Framework3.5.

Он работает нормально, когда на компьютере установлены только .NET 3.5 или 4.

Однако на компьютерах, где установлены как .NET 2 (или 3.0), так и .NET 4, приложение загружается с .NET 2 и сбой при доступе к Linq, поскольку он ищет библиотеки .NET 3.5.

Использование тега в app.config, похоже, не помогает, поскольку оно указывает версию CLR, которая равна 2 в случае .NET 3.5.

Обратите внимание, что наша установка проверяет, установлен ли .NET 3.5 или верхний.

Можно ли указать загрузку приложения:

  • самая высокая CLR, которую он находит, или
  • CLR 4, если он установлен, и CLR 2, если CLR 4 не установлен или
  • CLR 2, если установлен .NET 3.5 и CLR 4, если .NET 3.5 не установлен

(Обратите внимание, что аналогичный вопрос оставлен без ответа в разделе "Содержимое сообщества" документации Element)

Ответы

Ответ 1

Формирование вопроса привело меня к ответу. Как упоминалось в документе Element,

Когда несколько версий среды выполнения поддерживаются, первый элемент следует указать наиболее предпочтительный версии среды выполнения и последней элемент должен указывать наименьший предпочтительная версия.

Таким образом, для достижения второго варианта ( "CLR 4, если он установлен, а CLR 2 - CLR 4 не установлен" ) - это изменить порядок элементов в app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

Таким образом,.NET 4 будет загружен, если он установлен, и более ранняя версия будет загружена, если нет.

Ответ 2

Еще одна полезная ссылка: эта страница в MSDN. Это показывает все значения, необходимые в app.config, если вы хотите просто настроить профиль клиента или вам нужен полный профиль.

Ответ 3

В .NET Framework версии 3.0 и 3.5 используется версия 2.0.50727 из CLR.

Ответ 4

Если у вас есть неуправляемый EXE, вызывающий .NET DLL, вам также нужно создать файл foo.exe.config, содержащий вышеуказанный блок <startup>....