Наконец я нашел решение - я отправляю его здесь для других людей, у которых могла бы быть та же проблема (все 5 из Вас):
Под продуктом добавляют следующее:
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="YOUR_GUID">
<UpgradeVersion
Minimum="1.0.0.0" Maximum="99.0.0.0"
Property="PREVIOUSVERSIONSINSTALLED"
IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
Под InstallExecuteSequence добавьте:
<RemoveExistingProducts Before="InstallInitialize" />
С этого времени каждый раз, когда я устанавливаю продукт, он удалил предыдущие установленные версии.
Примечание: идентификатор обновления замены с Вашим собственным GUID
Сдвиг влево 8 бит и побитовое ИЛИ с j.
<<
- оператор сдвига влево. Сдвигает биты в переменной влево на указанное количество позиций.
>>
- оператор сдвига вправо. Сдвигает биты в переменной вправо на указанную позицию.
|
- это побитовый оператор ИЛИ. Выполняет логическое ИЛИ для каждого бита в двух операндах.
&
- это побитовый оператор И. Выполняет логическое И для каждого бита в двух операндах.
| = побитовое или
1010
0100
----
1110
& = побитовое и
1011
0110
----
0010
, поэтому это то же самое, что и && и || просто с отдельными битами
<< сдвиг влево, поэтому
0110 << 2 сдвигает числа влево на две позиции, давая 011000 другой способ думать об этом - умножение на два, поэтому x << 1 == x * 2, x << 2 == x * 2 * 2 и так далее, поэтому это x * Math.pow (2, n) для х <
>>
наоборот, поэтому 0110 >> 2 ---> 0001 вы можете думать об этом как о делении на два, НО с округлением в меньшую сторону, поэтому оно равно
Math.floor(x/Math.pow(2,n))
<< - побитовый сдвиг влево. >> - побитовый сдвиг вправо. | является побитовым ИЛИ. & - побитовое И. Для получения дополнительной информации см. в этой ссылке .