Обнаружение .NET 4.5.1 и будущих версий с обратной совместимостью

В соответствии с рекомендациями, изложенными в статье MSDN Как определить, какие файлы . Установлены версии NET Framework Я написал установщик WiX, чтобы проверить ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Release, чтобы определить, что .NET 4.5.1 установлен, и использовать это обнаружение, чтобы установить необходимое условие.

Проблема, с которой я столкнулся сейчас, заключается в том, что при установке .NET 4.5.2 тот же ключ больше не 378675 или 378758, а теперь 379893. Предполагается, что .NET 4.5.2 представляет собой «высокосовместимое обновление на месте», однако рекомендуемый алгоритм проверки версии не является обратно совместимым.

При проверке предыдущих версий этой проблемы не было, ключи реестра 2.0, 3.0 и 3.5 все еще присутствуют, даже если установлена ​​более поздняя версия. например HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Version по-прежнему присутствует, даже если установлена ​​версия 3.5.

Таким образом, ранее метод определения версии, рекомендованный Microsoft, был совместим с более ранними версиями, но это больше не относится к 4.5/4.5.1/4.5.2. Что тогда, я должен делать вместо этого? Я ненавижу просто добавлять 379893 (.NET 4.5.2) к набору значений реестра, которые я проверяю, поскольку это, по-видимому, не удастся, когда (если) будет выпущен .NET 4.5.3 (или другой). Возможно, я мог бы проверить HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Version для >= 4.5.51641, но это не рекомендуемый подход в соответствии с MSDN, и что произойдет, если они выпустят, скажем, 4.6, что каким-то образом не обратно совместимый?


person Snixtor    schedule 12.08.2014    source источник
comment
я бы предположил, что несовместимый выпуск больше не будет устанавливать свой ключ версии под v4.   -  person ths    schedule 13.09.2014
comment
Microsoft больше не хочет, чтобы вы это делали, поэтому максимально усложнили задачу. Программы .NET знают, как установить нужную им версию фреймворка, вы не должны им помогать.   -  person Hans Passant    schedule 31.10.2014


Ответы (2)


Чтобы найти версии .NET Framework, запросив реестр в коде (.NET Framework 4.5 и более поздних версиях):

Проверьте значение ключевого слова Release, чтобы определить установленную версию. Чтобы обеспечить совместимость с предыдущими версиями, вы можете проверить значение, большее или равное значениям, указанным в таблице.

Это было чуть ниже того места, где указывала ссылка MSDN в исходном вопросе (спасибо, что приблизили меня).

В моем файле .wxs у меня есть код, который, кажется, работает, но сбой с допустимым сообщением о слишком низкой версии .Net 4.5.

Поместите следующую ссылку на свойство и условие в ‹Product›:

<!-- Must have at least .Net 4.5.2 which has release 379893 -->
<PropertyRef Id="NETFRAMEWORK45RELEASE"/>
<Condition Message="$(var.ProductName) requires .NET Framwork 4.5.2. Please install the .NET Framwork then run this installer again.">
    Installed OR ( NETFRAMEWORK45RELEASE AND NETFRAMEWORK45RELEASE >= "#379893" )
</Condition>

Со следующим фрагментом, объявленным в другом месте:

<Fragment>
    <Property Id="NETFRAMEWORK45RELEASE">
        <RegistrySearch Id="NetFramework452Release"
                        Root="HKLM"
                        Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full"
                        Name="Release"
                        Type="raw" />
    </Property>
</Fragment>
person mheyman    schedule 31.10.2014

Я не уверен, почему вы должны беспокоиться о том, что будущая версия не будет обратно совместима, они все были до сих пор, и нет причин полагать, что это изменится. Вы создаете свой установщик сегодня, а не каждый раз, когда выходит 4.6, поэтому, даже если бы вы могли это обнаружить, что именно вы сделали бы? Отказаться от установки, хотя он, скорее всего, будет совместим? Нечего обнаруживать, кроме как убедиться, что установлена ​​​​версия .net [по крайней мере, на что вы нацелены].

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

person Ronan Thibaudau    schedule 12.09.2014
comment
Не все версии .NET обратно совместимы. Если бы у меня было приложение, предназначенное, например, для версии 2.0, и я проверил бы версию выше 2.0, мое приложение завершилось бы ошибкой на ПК, на котором только установлена ​​.NET 4.0. .NET 4.0 › 2.0, но не включает среду выполнения 2.0. - person Snixtor; 22.09.2014
comment
Встроить установщик не получится, например, невозможно установить .NET 4.5.1 поверх .NET 4.5.2. Если мое приложение принудительно удалит 4.5.2 в пользу 4.5.1, это потенциально нарушит работу других приложений, зависящих от 4.5.2. - person Snixtor; 22.09.2014
comment
@Snixtor нет, но если установлена ​​версия 4.5.2, установщик просто потерпит неудачу (это нормально из-за обратной совместимости), однако, если была установлена ​​какая-то гипотетическая версия 5.0, не включающая 4 и не включающая среду выполнения 4, установка будет успешной, поэтому это действительно работает здесь (в вашем примере 2.0 встраивание установщика 2.0 и запуск его во всех случаях является решением, если было установлено 3, оно было бы пропущено, если было установлено 4, оно было бы установлено, звучит так, как будто это решает нет твоей проблемы?) - person Ronan Thibaudau; 22.09.2014
comment
если установлена ​​версия 4.5.2, установщик просто потерпит неудачу - но это снова исходная проблема. Если установлена ​​версия 4.5.2, мой установщик должен не ошибиться, поскольку версия 4.5.2 обратно совместима с версией 4.5.1. Как я уже сказал, я мог бы попросить своего установщика проверить regkey на наличие ›= 4.5.51641. Но это не рекомендуемый MS метод, и в основном это реверс-инжиниринг. Я ищу доказательства того, что это подходящий вариант, а не догадки. - person Snixtor; 23.09.2014
comment
@Snixtor Нет, я имею в виду, что установщик .net 4.5.1 потерпит неудачу, не отмечайте его как обязательное условие, просто запустите установщик в автоматическом режиме, если он не работает, то все в порядке, а если он работает, тоже все в порядке! И в любом случае продолжайте установку программы независимо от того, не удалось ли установить .net (уже установлена ​​более высокая версия) или успешно (параллельная версия или нет версии, и установка прошла успешно) - person Ronan Thibaudau; 23.09.2014
comment
Но тогда программа установки завершится успешно, если установка .NET не удалась по какой-либо причине. Это не надежное решение. - person Snixtor; 23.09.2014
comment
Это правда, но я думаю, что вы слишком близко к сердцу управляете компьютером конечного пользователя, который не является вашим бизнесом как создателя приложения, укажите, что вашему приложению требуется .net версии X, кроме того, попробуйте установить его. в любом случае, чтобы убедиться, что если он все еще терпит неудачу, то что вы можете ожидать от создателя приложений .net на ПК, на котором .net не будет установлен? Я знаю, что это не кажется надежным, но для меня это кажется разумным компромиссом. - person Ronan Thibaudau; 23.09.2014
comment
Я нашел текст. Проверьте значение ключевого слова Release, чтобы определить установленную версию. Чтобы обеспечить совместимость с предыдущими версиями, вы можете проверить значение, большее или равное значениям, указанным в таблице на странице MSDN в вопросе. Я думаю, что это решает проблему. - person mheyman; 31.10.2014