微软在.Net中提供了几种分布式程序结构,如:web service,企业级服务,远程处理(Remoting). 由于Remoting在Internet中比较灵活,因此微软也定义它是DCOM的替代品.为了兼顾C/S结构较好的性能和B/S结构的较好分布式特点,所以很多企业应用是可以使用Remoting来实现的.好了废话少说也不打算在这里介绍Remoting的基础知识,让我们看实质的东西吧.
释义:
程序代号:Cantor Developer
环境:.net 2.0
自定义类库:Cantor.Common , Cantor.Resource , Cantor.Windows.Forms
首先让我们来看看更新的代码部分.
文件名: Cantor.Developer.Update.IService.cs
// ---------------------------------------------
// Cantor Developer 自动更新服务接口。
// 编写整理日期:2007年4月18日。
// 编写:陆松鹤。
// 整理:陆松鹤。
// ---------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Cantor.Common;
namespace Cantor.Developer.Update.IService
{
/// <summary>
/// Cantor Developer 自动更新服务接口。
/// </summary>
public interface IRemoteService
{
/// <summary>
/// Cantor Developer 更新服务。
/// </summary>
/// <param name="clientFileInfo">客户端文件信息。</param>
/// <returns></returns>
CDirectoryInfo GetUpgrade(CDirectoryInfo clientFileInfo);
}
}
文件名: Cantor.Developer.Update.Service.cs
// ---------------------------------------------
// Cantor Developer 更新服务。
// 编写整理日期:2007年04月08日。
// 编写:陆松鹤。
// 整理:陆松鹤。
// ---------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Cantor.Common;
using Cantor.Developer.Update.IService;
namespace Cantor.Developer.Update.Service
{
/// <summary>
/// Cantor Developer 更新。
/// </summary>
public class RemoteService : System.MarshalByRefObject,IRemoteService
{
/// <summary>
/// Cantor Developer 更新服务。
/// </summary>
/// <param name="clientFileInfo">客户端文件信息。</param>
/// <returns></returns>
public CDirectoryInfo GetUpgrade(CDirectoryInfo clientFileInfo)
{
CDirectoryInfo ci = new CDirectoryInfo(Cantor.Common.Cantor.UPGRADESOURCE);
string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
Cantor.Common.Cantor.UPGRADESOURCE);
try
{
DirectoryInfo di = new DirectoryInfo(path);
foreach (DirectoryInfo dic in di.GetDirectories())
{
CDirectoryInfo cic = new CDirectoryInfo(dic.Name);
ci.DirectoryInfos.Add(cic);
GetDirFiles(cic, dic, GetExistsDir(clientFileInfo.DirectoryInfos,dic));
}
foreach (FileInfo fi in di.GetFiles())
{
if (clientFileInfo == null || ExistFile(clientFileInfo.FileInfos, fi))
{
CFileInfo cfi = new CFileInfo();
cfi.Name = fi.Name;
cfi.FullName = fi.FullName;
cfi.LastWriteTime = fi.LastWriteTime;
cfi.FileData = CFileInfo.GetNewAssembly(fi.FullName);
ci.FileInfos.Add(cfi);
}
}
return ci;
}
catch (Exception ex)
{
throw ex;
}
}
// 是否存在更新文件。
private static bool ExistFile(ListFile clientFile, FileInfo fi)
{
foreach (CFileInfo cfi in clientFile)
{
if (string.Compare(cfi.Name, fi.Name, true) == 0)
{
return cfi.LastWriteTime < fi.LastWriteTime;
}
}
return true;
}
// 是否存在更新目录。
private static CDirectoryInfo GetExistsDir(ListDir ci, DirectoryInfo di)
{
foreach (CDirectoryInfo dic in ci)
{
if (string.Compare(dic.Name, di.Name, true) == 0)
{
return dic;
}
}
return null;
}
private void GetDirFiles(CDirectoryInfo ci, DirectoryInfo di, CDirectoryInfo clientFileInfo)
{
foreach (DirectoryInfo dic in di.GetDirectories())
{
CDirectoryInfo cic = new CDirectoryInfo(dic.Name);
ci.DirectoryInfos.Add(cic);
GetDirFiles(cic, dic, GetExistsDir(clientFileInfo.DirectoryInfos,dic));
}
foreach (FileInfo fi in di.GetFiles())
{
if (clientFileInfo == null || ExistFile(clientFileInfo.FileInfos, fi))
{
CFileInfo cfi = new CFileInfo();
cfi.Name = fi.Name;
cfi.FullName = fi.FullName;
cfi.LastWriteTime = fi.LastWriteTime;
cfi.FileData = CFileInfo.GetNewAssembly(fi.FullName);
ci.FileInfos.Add(cfi);
}
}
}
}
}