<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

我们经常要面对的是对开发模式的选择,比如C/S模式和b/s模式。现在,很多人都似乎比较喜欢选择B/S模式进行web的开发,这其中的原因是很多的。但其中一点很重要的原因,那就是因为B/S开发的话,部署非常之容易,因为这样很容易实现"瘦客户端",客户端只需要使用浏览器就可以运行应用了。但B/S模式下开发的WEB应用,也有其不足之处,主要是由于功能实现起来,是没办法和传统的C/S模式下的winform应用相比的,很多winform下要实现的优秀功能,在Web上都很难实现,或者说有的根本没办法实现。但传统的winform,在部署上也有自己的困难之处,如果客户端多的话,每次部署和版本升级都十分麻烦。

  在.net 2.0里,微软新推出了一项叫clickonce(一次点击)的应用程序部署技术,可以很好的解决上面的这个矛盾。在VS2005 中已经整合了clickonce的技术,使到用户可以很方便地部署winform开发的程序,很容易地管理其升级部署。

clickonce能带给我们什么

  首先,通过clickonce技术,我们可以实现如下的部署方式:

  1) 在设计完winform程序后,可以选择将程序发布到如下的存贮位置:文件系统,本地的Web服务器,FTP站点,远程Web站点。

2) 当应用程序部署到相应的位置后,用户可以通过浏览器浏览一个叫publish.htm的文件,点击下载的链接,将应用程序下载到本机安装。这个publish.htm是部署应用程序的一个入口文件。

3) 当用户安装完程序后,会自动产生快捷方式到桌面,并且在控制面版的增加删除中会找到该程序。

4) 当用户启动程序时,系统可以首先去检查服务端是否有新的程序版本,如果有的话,则会自动连接服务端,查看是否有新的版本,如果有新的版本的话,则自动下载新的版本到本机并安装,这对于C/S软件的升级维护来说是个福音

ClickOnce 应用程序具有如下优势:

1)更新是事务处理(即,要么完全执行,要么根本不执行)。

2)该应用程序不但可以脱机工作,而且还可以对其进行某种程度的控制;有一些 API 可使应用程序发现它是联机或脱机;它还可以控制其自身的更新过程;

3)它可以与 Visual Studio .NET 进行良好的集成,包括能够生成合适的额外文件和工具,帮助您找到运行应用程序所需的安全权限。

4)它具有一个可下载必需组件(甚至 .NET Framework 自身)的 Win32“bootstraper”可执行文件。

5)可以按需要或以批处理方式下载应用程序文件;

6)它可在 Start 菜单中添加快捷方式;

一个简单的clickonce程序部署的例子
声明:

例子代码来自嘻哈呵嘿C#版的端口扫描器(PortScanner一文,在此感谢他允许我使用他的成果.


Clickonce部署初体验//扫描类
Clickonce部署初体验
  classScanner
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
stringm_host;
Clickonce部署初体验
intm_port;
Clickonce部署初体验
Clickonce部署初体验
publicScanner(stringhost,intport)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验m_host
=host;m_port=port;
Clickonce部署初体验}

Clickonce部署初体验
Clickonce部署初体验
publicvoidScan()
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
//我们直接使用比较高级的TcpClient类
Clickonce部署初体验
TcpClienttc=newTcpClient();
Clickonce部署初体验
//设置超时时间
Clickonce部署初体验
tc.SendTimeout=tc.ReceiveTimeout=2000;
Clickonce部署初体验
try
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
//Console.Write("Checkingport:{0}",m_port);
Clickonce部署初体验
//尝试连接
Clickonce部署初体验
tc.Connect(m_host,m_port);
Clickonce部署初体验
if(tc.Connected)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
//如果连接上,证明此商品为开放状态
Clickonce部署初体验
Console.WriteLine("Port{0}isOpen",m_port.ToString().PadRight(6));
Clickonce部署初体验Form1.openedPorts.Add(m_port);
Clickonce部署初体验}

Clickonce部署初体验}

Clickonce部署初体验
catch(System.Net.Sockets.SocketExceptione)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
//容错处理
Clickonce部署初体验
Console.WriteLine(e.Message.ToString());
Clickonce部署初体验
Clickonce部署初体验}

Clickonce部署初体验
finally
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验tc.Close();
Clickonce部署初体验tc
=null;
Clickonce部署初体验Form1.scannedCount
++;
Clickonce部署初体验Form1.runningThreadCount
--;
Clickonce部署初体验
Clickonce部署初体验
Clickonce部署初体验}

Clickonce部署初体验}

Clickonce部署初体验}

Clickonce部署初体验
publicpartialclassForm1:Form
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
//已扫描端口数目
Clickonce部署初体验
internalstaticintscannedCount=0;
Clickonce部署初体验
//正在运行的线程数目
Clickonce部署初体验
internalstaticintrunningThreadCount=0;
Clickonce部署初体验
//打开的端口数目
Clickonce部署初体验
internalstaticList<int>openedPorts=newList<int>();
Clickonce部署初体验
//起始扫描端口
Clickonce部署初体验
staticintstartPort=1;
Clickonce部署初体验
//结束端口号
Clickonce部署初体验
staticintendPort=500;
Clickonce部署初体验
//最大工作线程数
Clickonce部署初体验
staticintmaxThread=100;
Clickonce部署初体验
Clickonce部署初体验
Clickonce部署初体验
publicForm1()
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验InitializeComponent();
Clickonce部署初体验}

Clickonce部署初体验
Clickonce部署初体验
privatevoidbtnScan_Click(objectsender,EventArgse)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
Clickonce部署初体验
Clickonce部署初体验
Clickonce部署初体验
//接收传入参数一作为要扫描的主机
Clickonce部署初体验
stringhost=this.txtHost.Text.Trim();
Clickonce部署初体验
//接收传入参数二作为端口扫描范围,如-4000
Clickonce部署初体验
stringportRange=this.txtStart.Text+"-"+this.txtEnd.Text;
Clickonce部署初体验
try
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验startPort
=int.Parse(portRange.Split('-')[0].Trim());
Clickonce部署初体验endPort
=int.Parse(portRange.Split('-')[1].Trim());
Clickonce部署初体验}

Clickonce部署初体验
catch(System.Exceptionex)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验MessageBox.Show(ex.Message.ToString());
Clickonce部署初体验
Clickonce部署初体验}

Clickonce部署初体验
Clickonce部署初体验
for(intport=startPort;port<endPort;port++)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
//创建扫描类
Clickonce部署初体验
Scannerscanner=newScanner(host,port);
Clickonce部署初体验Threadthread
=newThread(newThreadStart(scanner.Scan));
Clickonce部署初体验thread.Name
=port.ToString();
Clickonce部署初体验thread.IsBackground
=true;
Clickonce部署初体验
//启动扫描线程
Clickonce部署初体验
thread.Start();
Clickonce部署初体验
Clickonce部署初体验runningThreadCount
++;
Clickonce部署初体验
Clickonce部署初体验Thread.Sleep(
10);
Clickonce部署初体验
//循环,直到某个线程工作完毕才启动另一新线程,也可以叫做推拉窗技术
Clickonce部署初体验
while(runningThreadCount>=maxThread);
Clickonce部署初体验}

Clickonce部署初体验
//空循环,直到所有端口扫描完毕
Clickonce部署初体验
while(scannedCount+1<(endPort-startPort));
Clickonce部署初体验
this.lbInfo.Text="扫描结束!!";
Clickonce部署初体验
//输出结果
Clickonce部署初体验
Stringresult="";
Clickonce部署初体验result
+="总共有"+openedPorts.Count.ToString()+"个端口打开着!/n";
Clickonce部署初体验
foreach(intportinopenedPorts)
Clickonce部署初体验result
+="端口"+port.ToString().PadLeft(6)+"/n";
Clickonce部署初体验
if(MessageBox.Show(result,"扫描信息",MessageBoxButtons.OK,MessageBoxIcon.Information)==DialogResult.OK)
Clickonce部署初体验Clickonce部署初体验
Clickonce部署初体验{
Clickonce部署初体验
this.lbInfo.Text="";
Clickonce部署初体验}

Clickonce部署初体验}

Clickonce部署初体验}

Clickonce部署初体验

当运行上面的程序,如下图所示:

Clickonce部署初体验

接下来,我们可以对其进行发布了。鼠标右击PortScanDemo工程,选其中的属性"菜单,如下图所示:

Clickonce部署初体验


上图是项目的属性页,其中有许多选项。主要关注下其中的"发布"选项卡的配置。在最上面的"发布位置"选项框中,允许你指定将项目发布的位置。可以点旁边的"…"按钮,进一步浏览确定发布的位置,如下图:

Clickonce部署初体验


这里,我们可以设定项目要发布的位置,比如文件系统,本地服务器,FTP站点,远程站点等。

接着,我们在"安装模式和设置"选项组中,可以点选"系统必备"按钮,这里可以设置要运行该应用程序时,需要额外安装的库文件或其他必须的文件,如下图所示。默认必须安装的是.net framework 2.0


Clickonce部署初体验


同时,可以选择"安装模式和设置"选项卡中的更新选项,这个选项卡如下图所示:

Clickonce部署初体验



其中,默认是采用启动应用程序时检查更新的选项的。当然,你也可以选择,是在应用程序连接上网时自动检查是否有更新的版本,或者是选择当应用程序启动后,以后台进程的方式,自动检查是否有新的版本。

最后,选择"选项"选项卡,如下图,填入一些关于应用程序的信息。

Clickonce部署初体验



 最后,我们已经设置完毕,可以开始进行部署了。我们使用其中的"发布向导"进行发布。首先选定要发布的位置,如下图所示:

Clickonce部署初体验



"下一步"后,出现如下图,这里,可以选择你的应用是在离线或是可以同时运行在离线和在线状下的。

Clickonce部署初体验


  当应用是可以在在线或者离线状态下都可以运行时,发布成功后,应用程序可以在桌面出现快捷方式。当应用程序只能在在线状态下运行时,应用程序只能通过发布页面通过浏览器执行。

  最后再选“下一步”后,就成功完成了发布了,系统并自动打开IE浏览器,转到publish的页面。我们先来看下,在该应用程序发布到的目的目录下,我们会发现有如下图的文件。


Clickonce部署初体验

现在我们可以看到我们已经成功将PortScanDemo应用程序发布到当前IIS的根目录下了(c/inetpub/wwwroot/PortScanDemo),版本是<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Arial">1.0.0</span></chsdate>.0。而通过浏览器,可以看到如下的安装部署窗口:

Clickonce部署初体验

此时,按安装,就可以进行安装了,IE会打开如下窗口以提示你,目前正在下载一个应用程序安装。

Clickonce部署初体验

此外,你也可以在开始菜单中发现,新添加了你刚安装的程序的快捷方式,而且在控制面板中“添加和删除程序”中也可以轻易地卸载掉软件。

Clickonce部署初体验

从以上可以看出,在vs.net 2005中,对winform应用程序的安装部署更加方便了,是采用了所谓的smartclient的方式实现的,使的winform的应用程序也可以通过IE进行部署,并且可以很容易的获得应用程序最新的版本。但是,也不得不提一句我对这个技术的担心之处,安全性应该还是最让人关注的地方,它真的安全吗?这样的安装方式会不会给用户带来更大的麻烦呢??

相关文章: