我正在开发基于.NET 的客户端-服务器应用程序。服务器端在 Windows XP 上运行,客户端在 Windows CE 设备上运行(摩托罗拉 Symbol 3100,这可能是相关的)。
客户端需要自动更新功能,我决定自己实施,因为有几个主题阻止我使用任何现成的自动更新解决方案。我的应用程序每次启动时都会检查更新,并按 LastModificationTime 比较远程站点上的文件。如果有,它将文件从远程服务器下载到临时目录,然后停止并运行另一个应用程序来替换更新的文件并运行主应用程序。
文件正在通过套接字下载,因此在下载文件后,我的应用程序将每个文件的 LastModificationTime 设置为远程站点提供的值。我正在使用本主题中的时间更改解决方案,它运行良好,即文件修改时间更新得非常好,尽管其中一些文件的比较失败。可能相关的是,我的解决方案无法比较的那些文件是摩托罗拉符号 DLL。
问题是,尽管我做了很多工作,但每次我比较这些符号文件时,它们都有不同的修改时间戳。它总是相差 1 小时。例如,远程站点说文件时间是 1/24/2012 5:13:08,而在我的应用程序端它是 1/24/2012 6:13:08。任何其他文件都没有问题。那些“任何”是我的应用程序 exe、我的 DLL、第三方组件(如 OpenNETCF)提供的 DLL、MS .NET 相关文件等等。他们都没有给我带来麻烦 - 如果他们被更新,这只是一次,如果他们没有真正改变,那么就没有更新。在比较期间,我总是使用 ToUniversalTime() 以便不会发生与时区相关的差异(并且,正如我所提到的,这适用于其他文件)。所以我总是遇到这样的情况:
- 远程站点提供了许多文件,其中确实有更改的文件(我的应用程序、我的 DLL 等)以及那些符号 DLL(总是!)
- 文件已下载并更新
- 我的应用程序再次运行并再次检查更新
- 现在只有符号 DLL 被报告为已更改
- 应用程序陷入无限循环,因为符号 DLL 的修改时间总是相差 1 小时
我试图创建一个额外的应用程序来读取符号文件上的文件时间戳,然后再次设置它。我认为原始符号文件可能有一些“错误”的日期时间或其他东西。即使我将新时间设置为增加 1 秒,这也没有带来任何改进:在更新代码的比较期间,它又是 1 小时的差异。
最后,我决定从我的更新中删除这些符号文件。它们不经常更改,所以我有一些时间来发现这个问题,但如果摩托罗拉推出下一次更新 - 我会再次陷入我的问题。
我不知道问题的根源在哪里,如果有任何提示,我将不胜感激。我认为我的来源无关紧要,因为此问题仅发生在某些文件中,并且无论如何修改时间总是正确更改:我在我的设备上检查了它,在服务器部署文件夹中(从那里下载更新),无处不在。可能这是与时区相关的问题,但它如何只影响某些文件,而不是每个文件?
我将进一步解释。我的服务器在其更新文件夹中包含以下文件:
FliteDevice.dll
fliteDLL.dll
OpenNETCF.dll
OpenNETCF.AppSettings.dll
OpenNETCF.Configuration.dll
pdt.exe
PdtComm.dll
符号.dll
符号.xml
Symbol.Audio.dll
Symbol.Audio.xml
Symbol.Barcode2.dll
Symbol.Barcode2.xml
Symbol.StandardForms.dll
Symbol.StandardForms.xml
System.Data.OracleClient.dll
System.EnterpriseServices.dll
System.EnterpriseServices.Wrapper.dll
System.Transactions.dll
System.Web.dll
更新程序
考虑到这是我第一次运行更新,我的服务器将所有这些文件发送到客户端。我的客户端(pdt.exe)全部接收它们,运行 update.exe(并且存在,因此更新程序可以用较新的文件替换应用程序文件)替换更改的文件(此首次运行案例中的所有文件)。
然后更新程序运行我的应用程序(pdt.exe),我的应用程序再次检查其文件与服务器端的文件。现在要更新的文件是:
符号.dll
符号.xml
Symbol.Audio.dll
Symbol.Audio.xml
Symbol.Barcode2.dll
Symbol.Barcode2.xml
Symbol.StandardForms.dll
Symbol.StandardForms.xml
更新程序再次替换文件,并再次运行主应用程序。再一次,相同的文件(那些符号。*)被视为已更改、下载和替换。只有那些,在进一步的更新检查请求中不存在其他文件。绝不。正是这些文件有问题,不是我的代码,也不是其他文件。