Что произойдет, если я удалю автоматически добавленный элемент supportedRuntime?


У меня есть цель проекта 4.0. Я обновил его до 4.5 и VS добавил

<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>

в дополнение к изменению TargetFrameworkVersion и мне любопытно, если это избыточно. Мое понимание заключается в том, что если среда выполнения не supportedRuntime, он использует .net версии, используемые для построения exe-файла. Таким образом, в этом случае exe построен с использованием 4.5, и он также говорит, чтобы использовать 4.5. Будет ли он вести себя по-другому, есть ли у меня это или нет, и запустить его на машине, которая имеет только 4.0?

2 52

2 ответа:

документация MSDN не дает никаких хороших объяснений этого, но я нашел сообщение в блоге Скотта Ханзельмана под названием" .NET Versioning and Multi-Targeting-.NET 4.5-это обновление на месте до .NET 4.0" что показывает:

Если вы создаете клиентское приложение, например WinForms, Console, WPF и т. д., Это все автоматически. Ваше приложение.config содержит тот факт, что вам нужен .NET 4.5, и вы даже получите приглашение установить его.

Так запись конфигурации-это все о том, что происходит, если пользователь с .NET 4.0 на своем компьютере (но не .NET 4.5) пытается запустить приложение .NET 4.5. Оба .NET 4.0 и .NET 4.5 построены на версии 4 среды CLR, поэтому они теоретически совместимы; те же двоичные форматы и все такое. Единственное различие между двоичным файлом, построенным на .NET 4.0, и двоичным файлом, построенным на .NET 4.5, - это библиотеки, на которые они ссылаются.

таким образом, приложение, скомпилированное для .NET 4.5, может работать на компьютере только с установленным .NET 4.0. Однако он получит исключение времени выполнения, если вы попытаетесь использовать любые API, которые не существовали в 4.0.

если у вас есть эта запись файла конфигурации, и пользователь с .NET 4.0 пытается запустить приложение, приложение не будет работать, и пользователю будет предложено установить .NET 4.5. (См скриншот в блоге Скотта.) Это хороший дефолт для большинства людей.

если у вас нет записи config файл, тогда пользователь с .NET 4.0 сможет запустить ваш приложение, но получит исключение времени выполнения, если вы попытаетесь вызвать любые методы или использовать любые типы, которые были добавлены в 4.5. Это будет большая боль для вас как разработчика и для ваших тестеров. Вы должны сделать это только если у вас есть конкретных требований что ваше приложение должно работать на .NET 4.0 и необходимо воспользоваться новыми функциями 4.5, если они присутствуют (и вам нужно будет быть осторожным в обработке исключений и тщательно тестировать обе версии).

если ты хочешь быть в состоянии для работы на .NET 4.0, но не нужно никаких новых 4.5 API, тогда ваша жизнь намного проще: просто перейдите на вкладку сборки свойств проекта и целевой .NET 4.0. Затем компилятор гарантирует, что вы не вызываете API, которые не существовали в 4.0, и ваше приложение будет успешно работать как на .NET 4.0, так и на .NET 4.5.

отвечая на комментарий @Dai, а также обращаясь к тому факту, что при запуске в качестве службы Windows, вы не можете получить приглашение установить указанную версию в приложении.конфигурационный файл.

есть ли способ удалить его, но надежно обеспечить проверку версии .NET 4.0 vs 4.5 в коде?

вот что я использую, чтобы гарантировать, что текущая программа работает на данной версии .NET Framework, вдохновленной как я могу обнаружить во время выполнения, что .NET версии 4.5 в настоящее время выполняется ваш код?

/// <summary>
/// Throws an exception if the current version of the .NET Framework is smaller than the specified <see cref="supportedVersion"/>.
/// </summary>
/// <param name="supportedVersion">The minimum supported version of the .NET Framework on which the current program can run.
/// The version to use is not the marketing version, but the file version of mscorlib.dll.
/// See <see href="https://blogs.msdn.microsoft.com/dougste/2016/03/17/file-version-history-for-clr-4-x/">File version history for CLR 4.x</see> and/or <see href="https://it.wikipedia.org/wiki/.NET_Framework#Versioni">.NET Framework Versioni (Build pubblicata)</see> for the version to use.
/// </param>
/// <exception cref="NotSupportedException">The current version of the .NET Framework is smaller than the specified <see cref="supportedVersion"/>.</exception>
/// <returns>The version of the .NET Framework on which the current program is running.</returns>
public static Version EnsureSupportedDotNetFrameworkVersion(Version supportedVersion)
{
    var fileVersion = typeof(int).Assembly.GetCustomAttribute<AssemblyFileVersionAttribute>();
    var currentVersion = new Version(fileVersion.Version);
    if (currentVersion < supportedVersion)
        throw new NotSupportedException($"Microsoft .NET Framework {supportedVersion} or newer is required. Current version ({currentVersion}) is not supported.");
    return currentVersion;
}

пример использования для обеспечения работы на .NET 4.6.2:

var v462 = new Version(4, 6, 1590, 0);
EnsureSupportedDotNetFrameworkVersion(v462);