欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows 公共组件的完整性

程序员文章站 2022-05-31 19:56:48
...

Windows 公共组件的完整性

今天和大家简单讨论一下 Windows 公共组件的完整性。所谓公共组件,指的是独立的、被其它应用程序引用的 PE 文件(程序集,DLL 或 EXE);所谓完整性,即除了实现功能方面的需求外,还需考虑状态监控、文件属性设置等,以提高组件的易维护性、部署的安全性等。具体的来讲,Windows 公共组件应该在完整性方面考虑如下几个方面:

  • 完善的日志系统
  • 版本信息和分发管理
  • 依赖项的完整部署
  • 程序签名及防火墙例外

对于项目经验较少的开发者而言,他们往往容易忽略组件的完整性,通常只考虑功能的实现,然后将本地编译生成的组件直接拷贝给他人使用。当组件出现异常时,需要花费大量的时间来定位问题。

完善的日志系统

如果你的组件是一个独立的 EXE 程序,或者提供了相对较为独立的功能,或者涉及到数据传输时,你都应该为其设计完善的日志系统,用于记录其运行状态,或者记录通讯数据。这样有助于引用方定位问题,当系统未按预期运行时,能够快速地根据日志定位出问题的范围(是组件的问题还是引用方本身的问题)。

例如,我们开发了一个上传文件的服务(UploadService.exe),该服务可以接收多个程序的上传指令,并能根据上传指令中的参数来将指定的本地文件上传到指定的服务器。我们需要在这个服务中添加日志系统,以记录其收到的每一条指令,并详细记录指令中的参数,在开始上传和完成上传的时候都要记录日志,还需将服务的异常信息写入日志中。当引用方的指令未按预期被执行时,便可通过日志文件来分析出错的原因,快速地将问题定位到组件内或组件外。

一定要重视日志系统,再小的组件都需要关注日志,甩锅神器啊!!!

关于如何添加日志,可参考:如何为你的模块添加日志

对于 .NET 组件,推荐使用 log4net 日志组件。

版本信息和分发管理

我们在发布一个新的公共组件时,通常忘记设置其版本信息,并且通过拷贝文件的方式给其它应用程序使用。在这种情况下,当涉及到版本更新时,通常很难知道应用程序中使用的是哪个版本、是否需要更新;当使用方报告组件有问题时,也难以定位使用方是否使用了正确的版本,新版中是否仍然存在此问题。总之,如果组件没有标记版本信息的话,很难维护。

.NET Framework 组件中,通常在程序集的 AssemblyInfo.cs 文件中进行配置。

[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]

这样一来便可通过文件属性中的 文件版本(File Version)产品版本(Product version) 来区别组件的版本了。

上面讲的是组件(文件)的版本信息,除此之外,我们还需解决组件的分发问题。文件拷贝不是优雅的分发方式,我们需要使用包管理器来实现组件的分发与管理。NuGet 是比较有名的 .NET 组件包管理工具,它提供了组件包的发布、安装、卸载、更新等功能,并已集成到了最新的 Visual Studuio 中,你值得拥有。

总的来说,关于组件的版本管理,涉及到如下两个方面:

  • 文件的版本信息
  • 组件的分发与管理(NuGet)

依赖项的完整部署

我们开发的组件可能依赖于第三方组件(比如 log4net 等),或者依赖于一些系统组件(比如 msvcp120.dllmsvcr120.dll 等)。这些依赖项一定要跟随分发,不然在部分系统下无法正常运行;另外,还需关注依赖项的版本号,引用方可能也直接引用了相同的依赖项,要避免版本冲突。

对于 .NET 组件而言,可以将依赖项嵌入到组件(主程序集)中,以降低分发的难度,推荐使用 Fody 来实现依赖项的嵌入,可参考:.NET 合并程序集(将 dll 合并到 exe 中)

程序签名及防火墙例外

这一点是最容易被忽略,也是最容易在客户端容易引发问题的。如果组件涉及到管理员权限操作(如向系统盘写文件、修改系统注册表等),则在启动时会弹出 UAC 授权提示,如果组件未签名,则可能被杀毒软件禁用。另外,如果组件涉及到通讯,则需要将其添加到防火墙例外中,以防频繁弹出提示或者被杀毒软件隔离。

程序签名及防火墙例外对于 EXE 类型的组件非常重要,一定要重视。

相关标签: 架构