【问题标题】:Is there any way to create a setup which update the current version of an application?有什么方法可以创建更新应用程序当前版本的设置?
【发布时间】:2019-11-15 09:08:40
【问题描述】:

我创建了一个简单的 C# WPF 程序,它通过单击按钮运行不同程序的各种设置,因此当我必须配置 PC 时它会自动执行一些任务。

最初,我使用了VS的发布功能,所以当我对代码进行更改并再次部署时,用户点击安装更新并且他拥有最新版本(太棒了),但是这个应用程序需要管理员权限,因为它安装了功能,创建了我上面写的文件夹,所以我将app.manifest 添加到我的项目中,以便以正确的权限运行我的应用程序。我再次发布了项目,但出现错误,我读到 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 选项和 ClickOnce 不能同时存在,我在代码下方找到了一些解决方法但不是很实用:

     public MainWindow()
     {
        InitializeComponent();            
        AdminRelauncher();
     }

     private void AdminRelauncher()
     {
        if (!IsRunAsAdmin())
        {
            ProcessStartInfo proc = new ProcessStartInfo();
            proc.UseShellExecute = true;
            proc.WorkingDirectory = Environment.CurrentDirectory;
            proc.FileName = Assembly.GetEntryAssembly().CodeBase;
            proc.Verb = "runas";
            try
            {
                Process.Start(proc);
                Application.Current.Shutdown();
            }
            catch (Exception ex)
            {
                MessageBoxResult mess = MessageBox.Show("Program must be run as admin! \n\n" + ex.ToString());
            }
        }
    }

    private bool IsRunAsAdmin()
    {
        try
        {
            WindowsIdentity id = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(id);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
        catch (Exception)
        {
            return false;
        }
    }

之后,我使用 Microsoft VS Installer Projects 创建了一个设置,它运行良好,但每次我对代码进行更改或修复时,我都必须部署该设置 -> 卸载旧程序 ->安装新的,这是浪费时间。

那么有什么方法可以部署某种安装程序或其他检查应用程序更新的东西吗?

或者更好地以管理员身份运行使用 ClickOnce 安装的应用程序?

【问题讨论】:

  • Microsoft VS 安装程序项目可以覆盖他们以前的安装,这应该不是问题。您遇到什么问题迫使您必须卸载旧程序?您可能没有增加版本/内部版本号吗?如果我没记错的话,这不仅要在应用程序中完成,还要在安装程序配置的某个地方完成。
  • @Longoon12000 好的,我现在试试,你知道是否可以发布设置而不是将其复制并粘贴到发布文件夹?
  • 发布方式...?如果您只想将安装程序项目的输出复制到其他路径,您可以在安装项目的属性窗口 (here) 中指定构建后事件。
  • @Longoon12000 发布到网络文件夹中。无论如何,我尝试使用高版本的程序启动设置,但出现错误。

标签: c# wpf deployment


【解决方案1】:

最好创建另一个应用程序,启动器,其目的是检查其他应用程序上的本地文件的版本号是否低于存储在数据库/ftp 中的版本号。如果是真的,那么您的 Launcher 将从您的 ftp 下载新版本并覆盖旧版本。就像我在做我目前的 C# 项目一样:P

当然,您也可以将 Launcher 设为主要可执行文件,在更新检查结束时,它可以运行您的程序,仅此而已,您的用户只需运行启动器即可更新和/或运行您的主程序程序。

【讨论】:

  • 太好了,你能提供一些代码或参考资料,我可以从哪里开始学习如何实现它?
  • 为了连接到 ftp 并获取包含当前版本号的文件,您必须开始使用 FTP ftp = new FTP("your.host.com"); ftp.Connect("user", "password"); 创建一个 FTP 对象现在您可以从 ftp 获取文件使用 ftp.GetFile(),读取版本号,并与本地文件的版本号进行比较。如果版本不同,则再次使用 ftp.GetFile() 以获取程序的 .exe。希望对您有所帮助...很难与您分享我的代码,因为这是一个庞大项目的一部分。
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2019-11-08
  • 2022-12-20
相关资源
最近更新 更多