自我更新.net CF应用程序

时间:2009-02-25 18:21:38

标签: compact-framework

我需要通过网络服务让我的CF应用程序自我更新。 我从2003年在MSDN上发现了一篇很好解释的文章。不过,我想在这里练习一下。有人真的以前做过或者每个人都依赖第三方解决方案吗?

我被特别要求这样做,所以如果你知道任何提示/警告,任何信息都会受到赞赏。

谢谢!

4 个答案:

答案 0 :(得分:2)

这相对容易。基本上,您的应用程序调用Web服务来将其版本与服务器上可用的版本进行比较。如果服务器版本较新,则应用程序将新EXE作为byte []数组下载。

接下来,因为您无法删除或覆盖正在运行的EXE文件,您的应用程序会将其原始EXE文件重命名为“MyApplication.old”(操作系统允许这样做,幸运的是)。然后,您的应用程序将下载的byte []数组保存在与原始EXE文件相同的文件夹中,并使用相同的原始名称(例如“MyApplication.exe”)。然后,您向用户显示一条消息(例如“检测到新版本,请重新启动”)并关闭。

当用户重新启动应用时,它将是他们正在启动的新版本。新版本删除旧文件(“MyApplication.old”),更新完成。

让应用程序更新而不需要用户重启是一个巨大的痛苦(你必须启动一个单独的进程来进行更新,这意味着一个单独的更新程序应用程序本身不能自动更新)和我从来没有能够100%可靠地工作。我从来没有客户抱怨所需的重启。

答案 1 :(得分:2)

我回答过同样的问题: How to Auto-Update Windows Mobile application

基本上你需要两个应用程序。

App1:启动实际应用程序,但也检查CAB文件(安装程序)。如果cab文件在那里,它将执行CAB文件。

App2:实际申请。它将调用Web服务,将版本号传递给服务,并在存在新版本时检索URL()。下载后,您可以选择安装cab文件并关闭。

一个问题:如果您有一个安装文件系统的文件,但无法覆盖(数据库文件,日志等),则需要两个单独的安装。

安装cab:查找wceload.exe http://msdn.microsoft.com/en-us/library/bb158700.aspx

    private static bool LaunchInstaller(string cabFile)
    {
        // Info on WceLoad.exe
        //http://msdn.microsoft.com/en-us/library/bb158700.aspx
        const string installerExe = "\\windows\\wceload.exe";

        const string processOptions = ""; 
        try
        {
            ProcessStartInfo processInfo = new ProcessStartInfo();
            processInfo.FileName = installerExe;
            processInfo.Arguments = processOptions + " \"" + cabFile + "\"";

            var process = Process.Start(processInfo);
            if (process != null)
            {
                process.WaitForExit();
            }

            return InstallationSuccessCheck(cabFile);
        }
        catch (Exception e)
        {
            MessageBox.Show("Sorry, for some reason this installation failed.\n" + e.Message);
            Console.WriteLine(e);
            throw;
        }
    }

    private static bool InstallationSuccessCheck(string cabFile)
    {
        if (File.Exists(cabFile))
        {
            MessageBox.Show("Something in the install went wrong.  Please contact support.");

            return false;
        }
        return true;
    }

获取版本号:Assembly.GetExecutingAssembly()。GetName()。Version.ToString()

下载出租车:

        public void DownloadUpdatedVersion(string updateUrl)
    {
        var request = WebRequest.Create(updateUrl);
        request.Credentials = CredentialCache.DefaultCredentials;
        var response = request.GetResponse();

        try
        {
            var dataStream = response.GetResponseStream();
            string fileName = GetFileName();
            var fileStream = new FileStream(fileName, FileMode.CreateNew);

            ReadWriteStream(dataStream, fileStream);
        }
        finally
        {
            response.Close();
        }
    }

答案 2 :(得分:1)

“自我更新”究竟是什么意思?如果您指的是配置或数据,那么Web服务应该可以正常运行。如果您正在谈论自动下载和安装自己的新版本,那就是另一回事了。

从Microsoft发现this可下载样本 - 看起来应该有所帮助。

答案 3 :(得分:0)

如果您想使用第三方组件,请查看由MoDaCo的人员开发的AppToDate