问题描述:
    C#2005+ACCESS单机版应用程序
    希望升级通过版本补丁的方式进行,即升级文件为类似1.0-1.1.exe,1.1-1.2.exe这样的方式,只有一个可执行文件    (1)运行后会自动用新版本的文件替换掉旧文件
    (2)能通过执行已定义好的SQL来执行可能的数据库结构变更,以及其它一些非文件替换而需要程序来执行的操作.
    (3)补丁文件能自动检测该软件的安装目录,在任何目录下运行均能执行更新    我不清楚如何才能把新版本的DLL及EXE等文件放到升级补丁的EXE中,并让其在补丁运行的时候自动释放并替换.
    

解决方案 »

  1.   

    TCP/IP socket就可以实现..传送XML文件保存的版本信息.然后从服务器上下载相应版本的补丁文件
      

  2.   

    数据库的变更可以执行预定义的sql文件
      

  3.   

    补丁下载已经实现了,问题是现在我不知道这个补丁应该如何制作,来满足上面说的3点要求.有人说可以把更新文件作为内嵌资源,具体怎么实现有人知道吗?ClickOnce试过了,有很多的不便,安装目录不能指定,而且也不能实现非文件替换的更新操作
      

  4.   

    想简单省事就用VS自带的ClickOnce,
    想个性化的,那就得自己动手做了
      

  5.   

    问题已解决.    可以创建一个补丁项目,把需要更新的文件以资源文件的方式添加进项目,即可实现文件更新.
        数据库结构变更可以执行定义的好的SQL.
        获取软件安装目录的一般方法:
    using (RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall", false))
                {
                    if (key != null)
                    {
                        foreach (string keyName in key.GetSubKeyNames())
                        {
                            using (RegistryKey key2 = key.OpenSubKey(keyName, false))
                            {
                                if (key2 != null)
                                {
                                    string softwareName = key2.GetValue("DisplayName", "").ToString();
                                    string installLocation = key2.GetValue("InstallLocation", "").ToString();
                                    if (!string.IsNullOrEmpty(installLocation))
                                    {
                                        //this.textBox1.AppendText(string.Format("软件名:{0} -- 安装路径:{1}\r\n", softwareName, installLocation));
                                        listBox1.Items.Add(string.Format("软件名:{0} -- 安装路径:{1}\r\n", softwareName, installLocation));
                                    }
                                }
                            }
                        }
                    }
                }