Что на самом деле означает нацеливание на фреймворк и как мне добиться максимальной совместимости? - PullRequest
40 голосов
/ 06 декабря 2010

Привет всем,

Это смущало меня с тех пор, как я впервые начал писать код на C #.Моя цель - создать сборку, которая будет работать на самой последней платформе .NET, какой бы пользователь ни был.Я не хочу требовать установки .NET 4, но я хочу использовать его, если он у пользователя, и, что более важно, я хочу, чтобы он продолжал работать, если у пользователя только .NET 4и ничего ниже.Я начинаю подозревать, что это даже невозможно.

Я не совсем понимаю, что выбираю, когда меняю «Целевую платформу» в Visual Studio.Означает ли это "будет совместим с этой версией и выше"?Или "будет совместима только с этой версией"?Кажется, что это последний пока;мои тесты на виртуальных машинах показывают, что целевые сборки .NET 4 не работают без .NET 4, а целевые сборки .NET 3.5 не работают без .NET 3.5.Нет ли способа установить это так, чтобы я мог достичь максимальной совместимости?

ОБНОВЛЕНИЕ: Чтобы уточнить, у меня есть программа, нацеленная на .NET 2. Представленные здесь постеры, похоже, указывают, что она должна загружаться с .NET 4.Но в среде, где есть только .NET 4 и ничего до этого, он не загружается.

ОБНОВЛЕНИЕ2: Хорошо, разобрался, но это гораздо сложнее, чем, кажется, думают авторы.Я открываю другой вопрос, чтобы обсудить тонкости, но короткая версия такова, что вам нужен app.config с <supportedRuntime version="v4.0" />, если вы хотите запускать сборки не .NET 4 в .NET 4. Они не будутзагрузить без него.

Ответы [ 4 ]

22 голосов
/ 06 декабря 2010

Фреймворки разработаны для обратной совместимости;если у вас есть программа, написанная на .NET 2.0, вы можете запустить ее во время выполнения 4.0, потому что ни одна из платформ никогда не удалит функциональность, которая была в предыдущей версии (именно поэтому у нас все еще есть неуниверсальные коллекции, такие как ArrayList, хотяони устарели в пользу общих коллекций).Однако обратное не обязательно верно;не гарантируется, что приложение 4.0 будет работать в 2.0, поскольку оно МОЖЕТ использовать преимущества новых функций новой среды выполнения, недоступных в предыдущих версиях.В любом случае, если вы хотите, чтобы ваше приложение пыталось запускаться на версиях времени выполнения, для которых оно не предназначено специально, вы должны указать это в app.config с использованием элементов SupportedRuntime.

Чтобы ответить на конкретный вопрос, вы можете сделатьчто вы хотите с помощью следующей базовой процедуры:

  • Разработайте ваше приложение для целевой версии EARLIEST Framework, которую вы хотите поддерживать.Это отключит доступ к новым функциям более новых сред выполнения (например, Linq в 3.5 и динамическая типизация в 4.0), гарантируя, что вашему приложению не потребуются какие-либо функции, которые не могут быть предоставлены ни одним из поддерживаемых сред выполнения.

  • Укажите рамки, приемлемые для вашего приложения, используя элемент SupportedRuntime в файле app.config.Это сообщит нативному коду, который инициализирует среду выполнения, в которой будет запускаться ваше приложение, что, если оно не может найти целевую версию, любая другая является приемлемой.Я считаю, что в первую очередь нужно искать целевую платформу, и, если она недоступна, следует использовать новейшую поддерживаемую среду выполнения.

2 голосов
/ 06 декабря 2010

.NET обратно совместим, это означает, что если вы выберете .NET Framework 2.0 в качестве целевой платформы, он будет работать на установленных версиях 2.0, 3.0, 3.5 и 4.0. Но если вы выберете, например, версию 4.0 в качестве целевой платформы, она будет работать, только если у вас установлена ​​версия 4.0.

0 голосов
/ 06 декабря 2010

Вот как работает таргетинг: если вы ориентируетесь на .NET 3.5, он не будет работать, если у пользователя нет .NET 3.5. Он будет работать, если у пользователя есть более высокая версия.

Для максимальной совместимости выберите .NET 2.0, он будет работать даже на .NET 3.5, 4.0 и т. Д.

Однако вы можете потерять новые возможности .NET, такие как LINQ и т. Д.

http://msdn.microsoft.com/en-us/library/bb398197(VS.100).aspx

Можно ли по-прежнему ориентироваться на .NET Framework 2.0 в VisualStudio 2010?

0 голосов
/ 06 декабря 2010

Я считаю это должна быть любая выбранная вами версия и выше.Таким образом, если вы нацелены на фреймворк 2.0, он должен работать, если на клиенте установлены фреймворки 2.0, 3.0, 3.5 или 4.0.

При выборе этой опции вы также выбираете языковые функции, поэтому я не знаю, как вы сможете использовать функции платформы 4.0 с помощью приложения, ориентированного на 2.0.Даже динамическая загрузка сборок не работает, попробуйте загрузить dll, скомпилированную для 4.0, из приложения 2.0, это не даст вам.

...