winform
程序相对
web
程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的参考价值。
由于程序在运行时不能用新的版本覆盖自己,因此,我们将登录窗口单独做成一个可执行文件,用户登录时,从网上检测是否有新的主程序,如果有,则从后台下载并覆盖老的版本,用户输入正确的用户名和密码后,通过参数将必要的信息(如用户名、密码等)传递给主程序,实现登录,我们还是以实际例子来说明。
创建一个项目,不妨取名为
MainPro
,作为主程序,切换到代码窗口,看到如下一段代码:
///<summary>
///
应用程序的主入口点。
///</summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
为了接收参数,我们添加两个静态变量
m_UserName
和m_Password
用于存放用户名和密码,并修改
Main
函数为:
private static string m_UserName,m_Password;
///<summary>
///
应用程序的主入口点。
///</summary>
[STAThread]
static void Main(string[] args)
{
if(args.Length==2)//
有参数输入,你还可以根据实际情况传入更多参数
{
//
记录下用户名和密码,供软件使用
m_UserName=args[0];
m_Password=args[1];
Application.Run(new Form1());
}
else
{
MessageBox.Show("
不能从这里启动");
}
}
为了显示登录是否正确,
Load
事件的代码修改为:
private void Form1_Load(object sender, System.EventArgs e)
{
string msg=string.Format("
用户名:{0},密码:{1}",m_UserName,m_Password);
MessageBox.Show(msg);
}
这样,我们的示例主程序就完成了,只有加入参数才能运行该主程序,例如我们在
DOS
窗口中用“
mainpro user pass
”来启动该软件。
由于本项目涉及到不止一个程序,为保证运行正确,需要将编译后的可执行文件放到同一个文件夹,尽管我们可以编译后再将文件复制到同一个文件夹中,但每次都手工复制比较费事,这里采取一个简单的办法。先在硬盘中创建一个文件夹,如
D:/output
,选择菜单“项目”→“属性”,会弹出一个对话框,在配置(
C
)后面选择“所有配置”,选择配置属性的生成项,在输出路径中输入“
D:/output
”(如下图),再编译时你就发现,输出的可执行文件乖乖地跑到
D:/output
下面了。
接下来做一个上传工具,目的是将最新版本上传到服务器上,为简单,我们这里使用
access
数据库,当然,在网络版中可以使用
SQL Server
,原理完全一样。
在
D:/output
下新建一个
access
数据库,取名为
mydatabase.mdb
吧,新建两个表,一个为操作员,用来存放操作员的姓名和密码,另外一个为版本,用来存放主程序的最新版本,两个表的结构如下:
操作员表
|
版本表
|
||||
字段名
|
类型
|
用途
|
字段名
|
类型
|
用途
|
序号
|
长整型
|
主键
|
序号
|
长整型
|
主键
|
姓名
|
字符
|
用户名
|
版本号
|
长整型
|
存放当前版本
|
文件名称
|
字符
|
本记录对应的文件名
|
|||
密码
|
字符
|
密码
|
文件内容
|
OLE
对象,
SQL
中为
Image
|
存放文件的具体内容
|
我们手工输入一些用户名和密码,如下:
不要关闭刚才的主程序,直接选择菜单“文件”→“添加项目”→“新建项目”,输入项目名称为“
UpLoad
”,如下图:
点“确定”,同样,配置输出路径为
D:/output
。
在窗口上放入三个按钮(浏览(
btnBrow
)、确定
(btnOK)
和取消(
btnCancel
))、两个文本框
(txtFileName,txtVersion)
和相应的文字说明,如下图:
在“解决方案资源管理器”窗口中,选择“
upload
”项目,单击鼠标右键,选择“设为启动项目”,就可以运行该程序了。
添加浏览按钮的响应代码如下:
private void btnBrow_Click(object sender, System.EventArgs e)
{
OpenFileDialog myForm=new OpenFileDialog();
myForm.Filter="
应用程序(*.exe)|*.exe|所有程序(*.*)|*.*";
if(myForm.ShowDialog()==DialogResult.OK)
{