在数据库迁移失败时恢复以前的应用程序状态(ClickOnce)

时间:2017-09-30 14:34:41

标签: c# clickonce

我想恢复使用ClickOnce发布的以前版本的C#应用​​程序,如果数据库迁移失败,因为数据库不是最新的,并且它不支持最新版本的应用程序。

详细

我正在开发一个应用程序,它将在没有互联网的偏远地区本地使用。一个人会偶尔以某种方式通过互联网更新他/她的应用程序,然后将在本地网络上部署该应用程序。从那里每个人都可以获得更新版本的应用程序。我现在想要的是使用此应用程序使用数据库迁移,如果应用程序失败它应该还原到以前的版本。我已经使用 FluentMigrator 进行数据库迁移,并使用 ClickOnce 来部署应用。我也经历过这里的几乎所有链接,看看我该怎么做。我现在知道使用ClickOnce是不可能的。任何人都可以通过其他方式告诉我或者可能是某种黑客攻击吗?我正在使用ClickOnce,因为它具有自动更新功能,因此现在不想丢失该功能。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

因此,如果在执行期间发生某些问题,您希望运行以前版本的应用程序。

我不知道ClickOnce的解决方案,但它有类似的东西 - Squirrel。 坏消息是Squirrel也没有直接的解决方案,但它可以存储以前版本的应用程序,你可以运行它并且它可以工作(我只是在我的应用程序上检查过它)。

所以,有一个策略:

  1. 迁移到松鼠(他们有a tool
  2. 在紧急情况下 - 计算存储的先前版本的路径并运行它。相对路径应该类似于" ../ app-1.1.1 / myApp.exe"
  3. 但有一点需要牢记。只有从它升级应用程序时,Squirrel才会存储以前的版本。首次安装后没有上一个版本。

    祝你好运。

答案 1 :(得分:1)

FluentMigrator会跟踪数据库中的当前版本。它还会跟踪当前应用版本中的最新版本。运行Migrator功能并检查当前版本中的最新版本的迁移文件是否等于存储在数据库中的最新版本。如果两者相等,则迁移成功。如果它们不相等,则可以运行cmd命令直接打开(删除或备份)控制面板的窗口并转到以前的版本。这是使用ClickOnce恢复到以前版本的最佳方法。

try {
     new MigrationsWrapper(AppManager.ConnectionString).MigrateToLatestVersion();
}
catch (Exception ex) 
{

}
LatestVersionNumber = new MigrationsWrapper(AppManager.ConnectionStringADO).LatestVersionNumber;
CurrentVersionNumber = new MigrationsWrapper(AppManager.ConnectionStringADO).CurrentVersionNumber;
if (LatestVersionNumber > CurrentVersionNumber) {

 string applicationName = ConfigurationManager.AppSettings["ApplicationName"].ToString();
 string uninstallString = GetUninstallRegistryKeyByProductName(applicationName);
 if (uninstallString != string.Empty) {
      System.Diagnostics.Process process = new System.Diagnostics.Process();
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
      startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
      startInfo.FileName = "cmd.exe";
      startInfo.Arguments = "/c " + uninstallString;
      process.StartInfo = startInfo;
      process.Start();

 }
} else {
 // Successfull
}

答案 2 :(得分:0)

从描述中,应用程序的不同版本共享一个数据库。随着应用程序的新版本在计算机上运行,​​它需要修补/迁移共享数据库。如果失败,则不会安装应用程序。我们希望它能够在不破坏数据库的情况下失败。

可以加入clickonce事件。也许创建一个自定义安装程序。

https://msdn.microsoft.com/en-us/library/system.deployment.application.applicationdeployment_events.aspx

https://msdn.microsoft.com/en-us/library/system.deployment.application.applicationdeployment.aspx

发布ClickOnce应用程序 https://msdn.microsoft.com/en-us/library/748fh114.aspx

演练:为ClickOnce应用程序创建自定义安装程序 https://msdn.microsoft.com/en-us/library/dd997001.aspx

希望这有帮助。