Обновление приложения ClickOnce без изменения номера версии

У меня есть приложение ClickOnce, распространяемое в различных штатах Австралии, и, в зависимости от локальных компьютеров, возникают ошибки. Мне нужно найти какой-то способ обновления пользователя без удаленного доступа к его компьютеру и ручной замены DLL. Были выдвинуты идеи о том, чтобы обмануть ClickOnce, полагая, что текущая версия является более старой версией, для принудительного обновления для одного компьютера.

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

- Обновление прогресса--

Пытаясь обмануть ClickOnce, я нашел 4 файла, которые содержат номер версии продукта, 3 файла cdf-ms и 1 манифест. Два файла cdf-ms (оба в каталоге манифестов для приложения) могут сломать приложение, если номер версии будет изменен, что мне кажется многообещающим.

У них обоих есть строка "%publicKeyToken%", строка символов, а затем номер версии. Строка начинается одинаково в обоих, одна заканчивается "typewin32%%%", а другая - "версия%". Я думаю, что я иду в тупик, но это что-то.

Изменение номера версии после "version" приводит к следующей ошибке:

Problem signature:
 Problem Event Name:    CLR20r3
 Problem Signature 01:  RecordConnect.exe
 Problem Signature 02:  1.0.0.0
 Problem Signature 03:  56caca4f
 Problem Signature 04:  mscorlib
 Problem Signature 05:  4.0.30319.34209
 Problem Signature 06:  534894cc
 Problem Signature 07:  7e6
 Problem Signature 08:  0
 Problem Signature 09:  System.ArgumentException
 OS Version:    6.1.7601.2.1.0.256.48
 Locale ID: 3081
 Additional Information 1:  0a9e
 Additional Information 2:  0a9e372d3b4ad19135b953a78882e789
 Additional Information 3:  0a9e
 Additional Information 4:  0a9e372d3b4ad19135b953a78882e789

Изменение номера версии после "typewin32" приводит к следующей ошибке:

Following errors were detected during this operation.
    * [30/08/2016 12:20:29 PM] System.Runtime.InteropServices.COMException
        - The referenced assembly is not installed on your system. (Exception from HRESULT: 0x800736B3)
        - Source: mscorlib
        - Stack trace: 
            at System.Deployment.Internal.Isolation.IsolationInterop.CreateActContext(CreateActContextParameters& Params)
            at System.Deployment.Internal.Isolation.IsolationInterop.CreateActContext(IDefinitionAppId AppId)
            at System.ActivationContext.CreateFromName(ApplicationIdentity applicationIdentity)
            at System.ActivationContext.CreatePartialActivationContext(ApplicationIdentity identity)
            at System.Deployment.Application.ApplicationActivator.Activate(DefinitionAppId appId, AssemblyManifest appManifest, String activationParameter, Boolean useActivationParameter)
            at System.Deployment.Application.ApplicationActivator.ProcessOrFollowShortcut(String shortcutFile, String& errorPageUrl, TempFile& deployFile)
            at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
            at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

- Обновление прогресса--

Нашел реестр.

HKEY_CLASSES_ROOT \ Software \ Microsoft \ CurrentVersion \ Deployment \ SideBySide \ 2,0

Внутри целый ряд мест, где может храниться номер версии. Похоже, есть около 20 записей реестра, содержащих номер версии. Большинство изменений безвредны, один нарушает работу системы, а другой вызывает запрос на обновление. К сожалению, запрос на обновление еще не обновлен.

- Обновление прогресса--

Еще немного поиграл в реестре, сохранил файл.reg, чтобы облегчить жизнь..Reg обновил значение ComponentStore_RandomString, и это вызвало переустановку. Не совсем то, что нужно, но это что-то.

2 ответа

Решение

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

В реестре, если вы идете по следующему пути

HKEY_CLASSES_ROOT\Software\Microsoft\CurrentVersion\Deployment\SideBySide\2.0\PackageMetadata

Я нашел два ключа с длинными именами, которые выглядят как шестнадцатеричные значения для меня. В этих ключах есть еще 3 ключа, имя которых соответствует моему приложению, reco..tion. Два содержат похожее расширение, содержащее "0002.0001", но последнее содержит только длинную строку (токен открытого ключа), за которой следует другое, которое не изменяется при переустановке или установке совершенно другой версии программного обеспечения. Эта папка упоминается в первоначальном посте как та, которая сломала приложение, если оно было изменено. Как только это будет удалено, мое программное обеспечение считает, что это изменение версии (потому что метаданные, содержащие эту информацию, удалены), и переустанавливается поверх всего, что в самой последней версии.

Я искренне надеюсь, что это поможет другим в моем положении, но, учитывая объем информации, которую я узнал об этом в Интернете, я сомневаюсь, что многие люди пытаются выполнить эту глупую задачу.

Я думаю, что попытка обмануть ClickOnce будет болезненным и подверженным ошибкам процессом. Для большинства развертываний ClickOnce, которые я видел, я бы склонялся к настройке минимально необходимой версии здесь. Вы можете использовать минимально необходимую версию (в Visual Studio, перейдите на project properties > publish tab > Updates... button), чтобы пользователи могли продолжать использовать более старую версию вашего приложения, даже если вы выдвинули более новую версию. В вашем случае кажется идеальным установить минимальную требуемую версию для текущей версии, которая подходит для большинства людей, а затем распространить патч для всех. Ваш клиент с этой проблемой может воспользоваться последней версией, чтобы исправить свою проблему, но никто другой не вынужден обновляться, потому что он имеет минимально требуемую версию. Они могут обновлять в любое время, зная, что это ничего не изменит для них.

Вот некоторая документация по использованию минимально необходимой версии, поэтому вы можете посмотреть, подходит ли она вам, см. Раздел "Требуется обновление специально": https://msdn.microsoft.com/en-us/library/s22azw1e.aspx. Извините, если этот ответ не является сверхспецифическим, на это может повлиять очень много параметров, например, подключены ли вы только к сети, когда приложение проверяет наличие обновлений и т. Д.

Другие вопросы по тегам