.net remoting实战(一)

本文介绍了CantorDeveloper项目的自动更新服务实现,该服务利用.NET Remoting技术为客户端提供文件更新检查。通过对比客户端与服务器端文件的时间戳,确定是否需要进行更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      微软在.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);
                }
            }
        }
    }
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值