| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6214 人关注过本帖, 2 人收藏
标题:[求助]打包部署后自动更新
取消只看楼主 加入收藏
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏(2)
 问题点数:0 回复次数:6 
[求助]打包部署后自动更新

问题很常见,用过电脑的人都知道
在安装了某个软件后,当作者对软件进行了更改,打开时就要求自动更新
这个可能有点难度

或者说有哪位知道,在打包后,对软件进行了更改,重新打包补点包的方法
和安装

搜索更多相关主题的帖子: 打包 部署 自动 
2007-07-31 09:14
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏
得分:0 

怎么这么常见的问题没人顶呢

// 有关程序集的常规信息通过下列属性集
// 控制。更改这些属性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ccachem")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("cca")]
[assembly: AssemblyProduct("ccachem")]
[assembly: AssemblyCopyright("版权所有 (C) cca 2007")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("4f52443b-6bf5-4fbc-1144-15d9bf080b7b")]

// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


提供思路:当修改了项目后,把版本号改成 1.0.0.1 ,每次用户打开主MDI先检测版号是否是最新版号,如果不是就更新
这只是本人提供给大家一起参考的一种思路,具体怎么实现,请大家多多帮忙

[此贴子已经被作者于2007-7-31 14:32:06编辑过]


2007-07-31 14:26
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏
得分:0 
在Windows下,一个EXE文件在运行的时候是被系统锁定的,在其运行期间是不能对其修改的,也不能被覆盖。
因此,直接从网上下载一个新版本文件覆盖旧版本文件是行不通的。
既然不能在运行的时候覆盖自身,那就只有先停止需要升级的程序,由别的程序来为它升级。
你可以回想一下金山霸或者其他的网上升级程序,它不是在主程序升级,而是有一个辅助升级程序。
举例来说,程序A需要升级到新版的A',但在A运行的时候A'不能覆盖A,这时A必须停止,而由B来从网上下载A',从而覆盖A。
将这个过程联起来就是:
1)A启动B,
2)A停止运行,
3)B下载A',
4)B启动A',
5)B停止运行。
这样就运行了A',即新版的A。这里,可以将A看成主程序,而将B看成辅助升级程序。
实现B的升级同样道理,不同的是升级程序换成了A。
.net提供的WebHttpRequest和WebHttpResponse可以使你很容易的实现下载新包的工作。当然,你还必须做一些工作来判断计算机上的版本是否最新版本。

以上是位牛人的看法,不过人家很忙,只叫我自己琢磨,不知哪位能根据我的思路写个实例

2007-07-31 16:18
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏
得分:0 
关于升级程序的讨论

没想这么多想知道,那大家就一起研究下吧,我先把我做的部分共享给你们帮忙完善

数据库表: UpDateTime

标识 更新日期 更新版号 更新描述 补丁包下载地址
-------------- --------------------- -------------- ------------- ------------------
id (int 主键) updatetime (datetime) cono (varchar) mtext (text) httpurl (varchar)


1 2007-07-31 1.0.0.1 相关描述在此省略 http://192.168.0.100/1.rar
2 2007-08-01 1.0.0.2 相关描述在此省略 http://192.168.0.100/1.rar

上表是远程服务器上的一张表,初始了两条数据作为测试

在更新后会在项目中产生一个AutoUpdater.xml文件用于记录更新后的版本信息,以便下次检测数据表,是否有新更新
所以在首次打包部署的时候,初始这个XML文件,如下

<?xml version="1.0" encoding="utf-8" ?>
<AutoUpdater>

<UpdateInfo>
<UpdateTime Date = "2007-07-30"/> <!--升级文件的更新日期-->
<Version Num = "1.0.0.0"/>
<!--升级文件的版本号-->
</UpdateInfo>

<UpdateFileList> <!--升级文件列表-->
<UpdateFile FileName = "aa.txt"/> <!--共有三个文件需升级-->
<UpdateFile FileName = "VB40.rar"/>
<UpdateFile FileName = "VB4-1.CAB"/>
</UpdateFileList>

<RestartApp>
<ReStart Allow = "Yes"/> <!--允许重新启动应用程序-->
<AppName Name = "TIMS.exe"/> <!--启动的应用程序名-->
</RestartApp>

</AutoUpdater>


方法如下:
/// <summary>
/// 获取客户端应用程序及服务器端升级程序的最近一次更新日期
/// </summary>
/// <param name="Dir">路径</param>
/// <returns></returns>
public string GetTheLastUpdateTime(string Dir)
{
string LastUpdateTime = "";
string AutoUpdaterFileName = Dir + @"\AutoUpdater.xml";
if (!File.Exists(AutoUpdaterFileName)) //AutoUpdater.xml文件不存在
{
return LastUpdateTime;
}

//打开xml文件
FileStream myFile = new FileStream(AutoUpdaterFileName, FileMode.Open);
//xml文件阅读器
XmlTextReader xml = new XmlTextReader(myFile);
while (xml.Read())
{
if (xml.Name == "UpdateTime")
{
//获取升级文档的最后一次更新日期
LastUpdateTime = xml.GetAttribute("Date");
//MessageBox.Show(LastUpdateTime);
break;
}
}
xml.Close();
myFile.Close();
return LastUpdateTime;
}

/// <summary>
/// 比较更新日期和客户端日期
/// 如果需更新日期 > 客户端最后一次更新日期,就列出更新版号
/// 单击版号下载补点包
/// </summary>
public void GetUpdateTime()
{
string t2 = this.GetTheLastUpdateTime(@"../../"); //获取AutoUpdater.xml中日期
string t1 = "";
ArrayList list = new ArrayList();

string sql = "select updatetime,cono from UpDateTime";
SqlCommand cmd = ClassLibraryMain.Bind_Command.BuildSqlCommand(sql);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
t1 = Convert.ToDateTime(dr["updatetime"]).ToString("yyyy-MM-dd");
if (Convert.ToDateTime(t1) > Convert.ToDateTime(t2)) //比较客户端和服务端更新日期
{
list.Add(dr["cono"].ToString().Trim());
//用数组存放需要更的的版号,
//有可能这人懒,好几月没上线了,
//所以有好几个版本需更新,所以列出存入可变数组

}
}

foreach (string item in list)
{
MessageBox.Show(item); //列出需更新的版号
}

ClassLibraryMain.Bind_Command.CloseSqlCommand(cmd);
}



GetUpdate getup = new GetUpdate(); //忘了说了GetUpdate是我上述方法的命名空间

private void Login_Load(object sender, EventArgs e) //在登录窗体Load事件中调用方法
{
//getup.thePreUpdateDate();
getup.GetUpdateTime();
}

下面还在完善中,望大家帮我一起完善它

[此贴子已经被天使不哭于2007-8-16 17:20:22编辑过]


2007-08-01 02:17
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏
得分:0 

检查远程服务器是否存在文件的方法也很不错,这样的话上传一个新包就要删除旧包,文件名还要固定的,不是很灵活
再则从客户端检索远程服务端是否存在文件的执行效率不会比检索数据库来的快.
再从使用上来讲,如果我这个人很懒,或出差几个月没有登录过,我要升级两次以上才能正常使用系统了,那么检查远程是
否存在文件的方法就不是很灵活了


2007-08-01 09:02
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏
得分:0 
谢谢楼上的提示,很有创意哦
如果把压缩包放在数据库中,那不得不承认你的方法比我的更为先进和便捷
如果能自动下载+自解压执行安装,那就更完美了

把压缩包存入数据库我还没做过,楼上的大哥能不能提供下把RAR存入数据库的实例

2007-08-01 09:47
mlrh3838
Rank: 1
等 级:新手上路
威 望:1
帖 子:199
专家分:0
注 册:2007-6-14
收藏
得分:0 
哦,这样说我明白了,但我还有一事向问大家
比如我只修改了一个窗体,重新打包整个项目有点不太理想,有没有方法打包一个窗体成EXE
然后安装替换原件或在没有该窗体的前提下复制该文件进项目呢?

2007-08-01 11:19
快速回复:[求助]打包部署后自动更新
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025871 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved